xPDK xsection

This defines a xsection which in EDA-design is often called a cad or design layer. In OptoDesigner this is a mcs. The xsection's define what the port should refer to. A xsection is normally something like a waveguide or metal track and is often using multiple (gds) layers.

XSD(xsection):
Define mcs/cad/design layers with optical related properties.

Design layers which map via gridding onto GDS/Oasis/OpenAccess layers. mcs's provide for "optical" logic like default width, bend radius, coupling length and so on.
Each design layer can map to multipe GDS layers, so you can define a layer stack relating to a waveguide in a single definition.

Very basic definition.

full file
 <xsection name="WGbase">
  <purpose>Base waveguide</purpose>
 </xsection>
This definition is good for marking things up, but elements placed in this design layer will not go to a mask file.

Including GDS mapping and some properties

full file
<!-- define GDS layers for the <map> sections -->
<layer name="layer1" >
 <gds_number>1</gds_number> <gds_datatype>0</gds_datatype>
</layer>

<layer name="layer2" >
 <gds_number>2</gds_number> <gds_datatype>0</gds_datatype>
</layer>

<!-- define MCS layers -->
<xsection name="WG" >
  <purpose type="active">Waveguide with grid</purpose>
  <grid>
   <map accuracy="0.1">layer1</map>
   <map widen="2">layer2</map>
  </grid>
  <mcsSetWidth useDrc="false">0.5</mcsSetWidth>
  <mcsSetRadius min="100">200</mcsSetRadius>
 </xsection>

 <xsection name="Doc" >
  <purpose type="doc">Metal highlighting</purpose>
  <grid>
   <map accuracy="0.1">layer2</map>
   <map widen="2">layer2</map>
  </grid>
  <mcsSetWidth useDrc="false">0.5</mcsSetWidth>
  <mcsSetRadius min="100">200</mcsSetRadius>
 </xsection>

Documentation of the fields

purpose

XSD(purpose):
Define the purpose of the layer. Expected is a single liner.
An optional attribute is type which can have one of the following values: passive, active, doc, misc, metal, metalalt, metalrouting, metal1, metal2, metal3, metal4, metal5, metal6, metal7, metal8, metal9, rf, rf_gsg, rf_gssg, rf_s, rf_g.
Metal1-9 are for multi-layer metal, with '1' being closes to the photonics; moving up to higher numbers is typically done with VIA's.

doc

The doc can be a longer text (few paragraphs) to document the layer in more detail if needed.

XSD(doc):
Document anything relevant for the topic you want to define.

Multiple paragraphs is fine. Format is plain text.

tex

The tex can be a long text in LaTex format to document the layer in more detail if needed.

XSD(tex):
Document anything relevant for the topic you want to define.

Multiple paragraphs is fine. Format is Latex, so more complex content is possible.

color

Use a RGB color for the default settings in software; this is intended to have more consistent look over different software.

XSD(xPDK_color):
Define a RGB color using the attributes R, G and B.
Each of R, G and B is required and be between 0 and 256.

visible

Set visibility default settings in software; this is intended to have more consistent look over different software.

fillstyle

Set fillstyle (polygon area) default settings in software; this is intended to have more consistent look over different software.

XSD(fillstyle):
      fillstyle is default unfilled
      

linestyle

Set linestyle (polygon contour) default settings in software; this is intended to have more consistent look over different software.

XSD(linestyle):
      linestyle is default filled
      

grid

See Gridding.
XSD(grid):
An mcs can have zero grids, this makes it a display-only layer. To get something into GDS/Oasis/OpenAccess you need to have one or more gds-layers associated. Each can have a different widening.

mcsSetWidth

full file
 <xsection name="WG">
  <mcsSetWidth useDrc="false" min="0.1">0.5</mcsSetWidth>
 </xsection>
XSD(mcsSetWidth):
Define the default width (in um) for a curve / waveguide.
Using this value in the BB-sections of xPDK simplifies maintenance. It also shows better the intent of certain equations / values.

XSD(mcsSetWidth:attributes):
With the optional attribute min you can give a value for the minimum also. This can be used in BB design or parameter.
If min is set, then OptoDesigner will also validate curves against this value - so the "logical" value rather (per-se) the geometrical value as due to grid/map you may have different values for that.
If this is not intended, use useDrc="false" as attribute.

mcsSetRadius

full file
 <xsection name="WG">
    <mcsSetRadius useDrc="false" min="1">50.0</mcsSetRadius>
 </xsection>
XSD(mcsSetRadius):
This sets the default radius (in um) for the xsection for curved / bended waveguides.
The waveguide/port bend radius is measured with respect to the geometrical waveguide center (in the case of most common symmetric waveguides).
Using this value in the BB-sections of xPDK simplifies maintenance. It also shows better the intent of certain equations / values.

XSD(mcsSetRadius:attributes):
With the optional attribute min you can give a value for the minimum also. This can be used in BB design or parameter.
If min is set, then OptoDesigner will also validate curves against this value - so the "logical" value rather (per-se) the geometrical value as due to grid/map you may have different values for that.
If this is not intended, use useDrc="false" as attribute.

mcsSetUncoupledDistance

full file
 <xsection name="WG">
  <mcsSetUncoupledDistance>2.0</mcsSetUncoupledDistance>
 </xsection>
XSD(mcsSetUncoupledDistance):
Define the center/center distance (in um) between two curves for which they are to be reasonably uncoupled.
The reasonable is not a hard specification, but indicative. Reasonable values are when the coupling length will be close to the chip length.

mcsSetTaperAngle

full file
 <xsection name="WGbase">
  <mcsSetTaperAngle>1.0</mcsSetTaperAngle>
 </xsection>
XSD(mcsSetTaperAngle):
Define a tapering angle (in degree) which should be used for automatic tapers when width-changes are detected.
Recommended is to use an angle that is low enough to avoid mode or polarisation conversion.

mcsSetSBOffset

full file
 <xsection name="WG">
  <mcsSetSBOffset>0.01</mcsSetSBOffset>
 </xsection>
XSD(mcsSetSBOffset):
Define a good straight/bend offset (in um) for a transistion for the default width/radius.
You can use the <spt> to define more complex (radius dependent) values also or apply a complete mcsModeModel for that.
These are OptoDesigner specific values, but the typical width/radius is often used.

mcsSetGap

full file
 <xsection name="WG">
  <mcsSetGap>2.0</mcsSetGap>
 </xsection>
XSD(mcsSetGap):
This sets the gap (in um) for two curves to stay uncoupled. It relates to mcsSetUncoupledDistance, but this is suitable for tapering elements also.

mcsSetTextExpand

full file
 <xsection name="WG">
  <mcsSetTextExpand>20</mcsSetTextExpand>
 </xsection>
XSD(mcsSetTextExpand):
This value (in nm) is used in OptoDesigner to shrink or grow the pixels of a text font.
This is often needed to prevent design rule fails on small vertices or sharp angles.

spt

full file
 <xsection name="WG">
  <od_spt>// This section does some special OptoDesigner things.
   mcsSetCurveCheck();
   mcsSetAltWG("WGhigh","WGlow");
  </od_spt>
 </xsection>
XSD(spt):

extend

Allows to extend with any (complex) data for enriching a design kit. The sub-data of an extend will normally be vendor or provider specific, but may span multiple software vendors or suppliers.
Provider extensions can be references to (or embedded) reporting scripts or their versions; source database references and so on. Such data is helpful in cross-referencing production issues or differences between export snapshots. Embedding such data in the XML rather then side-files enhances tracebility and reduces errors.

More details on extensions naming & conventions.

name

The name must be defined, be unique and be "identifier".

XSD(name):
Defines a valid name for an identifier.
In text this is a letter, followed by letters, numbers, underscore or dot. The check is regular expression: [A-Za-z]([A-Za-z0-9_])*

Gridding: xsection → gdslayer

The conversion from xsection / mcs to gdslayer is a key aspect. It is handled in the grid section where many maps can be defined.
Each mapping adds a possibly modified copy using the widening or lengthening of the data to the respective gdslayer.

You can define a mix of widen, lengthen, accuracy and so on per map and they will be jointly used for one mapping to the GDS layer in the <map>...</map>. The name in<map>...</map> should be the name of a layer or applayer.
The examples show only a single attribute per map to keep the example more focussed and the documentation more specific.

accuracy

full file
 <!-- define GDS layers for the <map> sections -->
<layer name="layer1" >
 <gds_number>1</gds_number> <gds_datatype>0</gds_datatype>
</layer>

<!-- define MCS layers -->
 <xsection name="WG">
  <grid>
   <map accuracy="0.1">layer1</map>
  </grid>
 </xsection>
XSD(accuracy):
This defines how accurate (in um) a curve should be approximated and does not directly relate to a GDS database grid. For photonic waveguides the 0.001 default is typical, while metal routing can use a lower accuracy like 0.01 um.
A rule of thumb is that each 10x more accurate approximation gives about 3x data size increase.

widen

full file
 <!-- define GDS layers for the <map> sections -->
<layer name="layer1" >
 <gds_number>1</gds_number> <gds_datatype>0</gds_datatype>
</layer>

<!-- define MCS layers -->
 <xsection name="WG">
  <grid>
   <map widen="4">layer1</map>
  </grid>
 </xsection>
XSD(widen):
Define a (curve) widening with a fixed value.

lengthen

full file
 <!-- define GDS layers for the <map> sections -->
<layer name="layer1" >
 <gds_number>1</gds_number> <gds_datatype>0</gds_datatype>
</layer>

<!-- define MCS layers -->
 <xsection name="WG">
  <grid>
   <map lengthen="2">layer1</map>
  </grid>
 </xsection>
XSD(lengthen):
Define a (curve) lengthening with a fixed value.

widen_OptoDesigner

full file
 <!-- define GDS layers for the <map> sections -->
<layer name="layer1" >
 <gds_number>1</gds_number> <gds_datatype>0</gds_datatype>
</layer>

<!-- define MCS layers -->
 <xsection name="WG">
  <grid>
   <map widen_OptoDesigner="{functor= #+4}">layer1</map>
   <map widen_OptoDesigner="{functor= #^2+4}">layer1</map>
   <map widen_OptoDesigner="{w -> cos(w)+4}">layer1</map>
  </grid>
 </xsection>
XSD(widen_OptoDesigner):
A widening of a track is with respect to the center of the curve.
It can be width-dependent in OptoDesigner, for example to auto-taper a RF GSG track correctly. Other software may or may not have this capability, but if so, they can use this field also.
For OptoDesigner the style should be one of:
  • functor (preferred & fast option)
    {functor= #+10.0}
    . Here the # is the local waveguide width and this example shows a 1 um widening.
    Using something like
    {functor= #*#+10.0*#+5}
    would lead to a quadratic widening.
  • local function (more flexible / general)
    {w -> w+ 10}
    . You can use define your own variable name before the -> and can use any expression possible in OptoDesigner.
Note If both widen_OptoDesigner and widen are available, OptoDesigner will use only the former.

lengthen_OptoDesigner

full file
 <!-- define GDS layers for the <map> sections -->
<layer name="layer1" >
 <gds_number>1</gds_number> <gds_datatype>0</gds_datatype>
</layer>

<!-- define MCS layers -->
 <xsection name="WG">
  <grid>
   <map lengthen_OptoDesigner="{functor= #+4}">layer1</map>
   <map lengthen_OptoDesigner="{functor= #^2+4}">layer1</map>
   <map lengthen_OptoDesigner="{w -> cos(w)+4}">layer1</map>
  </grid>
 </xsection>
XSD(lengthen_OptoDesigner):
A lengthening extends the input and output of a curve.
It can be width-dependent in OptoDesigner, for example to auto-taper a RF GSG track correctly. Other software may or may not have this capability, but if so, they can use this field also.
For OptoDesigner the style should be one of:
  • functor (preferred & fast option)
    {functor= #+10.0}
    . Here the # is the local waveguide width and this example shows a 10 um widening.
    Using something like
    {functor= #*#+10.0*#+5}
    would lead to a quadratic widening.
  • local function (more flexible / general)
    {w -> w+ 10}
    . You can use define your own variable name before the -> and can use any expression possible in OptoDesigner.
Note A lengthening is most often width independent.
Note If both lengthen_OptoDesigner and lengthen are available, OptoDesigner will use only the former.