class Layout(GenericWaveGuideTemplate.Layout): cladding_width = PositiveNumberProperty(default=2.0) exclusion_width = PositiveNumberProperty(default=20.0) cladding_layer = LayerProperty() exclusion_layer = LayerProperty() def _default_exclusion_layer(self): return TECH.PPLAYER.MSN_TRENCH def _default_core_layer(self): return TECH.PPLAYER.MSN def _default_cladding_layer(self): return TECH.PPLAYER.CLADDING def _default_core_width(self): return 0.45 def _default_windows(self): windows = [ PathTraceWindow(layer=self.core_layer, start_offset=-0.5 * self.core_width, end_offset=0.5 * self.core_width), PathTraceWindow(layer=self.cladding_layer, start_offset=-0.5 * self.cladding_width, end_offset=0.5 * self.cladding_width), PathTraceWindow(layer=self.exclusion_layer, start_offset=-0.5 * self.exclusion_width, end_offset=0.5 * self.exclusion_width) ] windows = [ PathTraceWindow(layer=layer, start_offset=-off / 2.0, end_offset=off / 2.0) for off, layer in zip([1, 2., 3.0, 5.0, 9.0], [ self.core_layer, self.cladding_layer, self.exclusion_layer ]) ] return windows
class __TwoLayerDesignRule__(__DesignRule__): """ Layer rule applying to two layers """ layer1 = LayerProperty(required=True, doc="First layer the rule applies to") layer2 = LayerProperty(required=True, doc="Second layer the rule applies to") def get_layers(self): l = LayerList() if isinstance(self.layer1, __GeneratedLayer__): l += self.layer1.layers() else: l += self.layer1 if isinstance(self.layer2, __GeneratedLayer__): l += self.layer2.layers() else: l += self.layer2 return l def __str__(self): return "Two layer rule %s %s" % (self.layer1, self.layer2)
class __LayerDesignRule__(__DesignRule__): """ Layer rule applying to one layer """ layer = LayerProperty(required=True, doc="Layer the rule applies to") def __str__(self): return "Layer rule %s" % (self.layer) def get_layers(self): l = LayerList() if isinstance(self.layer, __GeneratedLayer__): l += self.layer.layers() else: l += self.layer return l
class GdsiiLayerInputMap(StrongPropertyInitializer): layer_map = RestrictedProperty(required=True) default = LayerProperty(allow_none=True) def __init__(self, layer_map, **kwargs): super(GdsiiLayerInputMap, self).__init__(layer_map=layer_map, **kwargs) # check if the input map doesn't contain any duplicates on the "source side" (duplicates may exist on the target size) ln = [] for L in self.layer_map.keys(): ln.append((L.number, L.datatype)) if len(ln) != len(list(set(ln))): raise IpkissException( "layer_map may not contain duplicate layer number on the source-side." ) def __getitem__(self, key): for L in self.layer_map.keys(): if L.number == key.number and L.datatype == key.datatype: return self.layer_map[L] return self.default def get(self, key, default): return self[key]
class Layout(GenericWaveGuideTemplate.Layout): cladding_width = PositiveNumberProperty() cladding_layer = LayerProperty() def _default_cladding_width(self): return self.core_width + 4.0 def _default_core_layer(self): return TECH.PPLAYER.SI def _default_cladding_layer(self): return TECH.PPLAYER.SHALLOW def _default_windows(self): windows = [ PathTraceWindow(layer=self.core_layer, start_offset=-0.5 * self.core_width, end_offset=0.5 * self.core_width), PathTraceWindow(layer=self.cladding_layer, start_offset=-0.5 * self.cladding_width, end_offset=0.5 * self.cladding_width) ] return windows
class Rule(StrongPropertyInitializer): design_rule = DesignRuleProperty(required=True) error_layer = LayerProperty(required=True)