def _generate_elements(self, elems): # Center of the structure (x0, y0) = self.position # elems += i3.Rectangle(layer=self.layer, center=(x0, y0), # box_size=(self.length + self.release_margin, self.width + self.release_margin)) elems += i3.Rectangle(layer=self.layer, center=(300, 300), box_size=(200, 200)) rec = i3.Rectangle(layer=self.layer, center=(0, 0), box_size=(200, 200)) layer2 = i3.Layer(2) remove = i3.Wedge(layer=layer2, begin_coord=(-100, 0), end_coord=(-50, 0), begin_width=8, end_width=0.001) elems += rec elems += remove generated1 = self.layer - layer2 mapping = {generated1: self.layer} output_elems = i3.get_elements_for_generated_layers(elems, mapping) # # elems = elems | wedge, # haha = rec | remove, # elems += remove, # # elems +=rec, # elems = elems.extend(haha), return output_elems
def _generate_elements(self, elems): # The shape of the coupon you want to print for i in range(16): elems += i3.PolygonText(layer=i3.Layer(5), coordinate=(500, -3 + i * 30), text=str(300 + i * 50), alignment=(i3.TEXT.ALIGN.CENTER, i3.TEXT.ALIGN.TOP), font=i3.TEXT.FONT.DEFAULT, height=22, transformation=i3.Rotation((0.0, 0.0), 0.0)) elems += i3.PolygonText(layer=i3.Layer(5), coordinate=(4950, -3 + i * 30), text=str(300 + i * 50), alignment=(i3.TEXT.ALIGN.CENTER, i3.TEXT.ALIGN.TOP), font=i3.TEXT.FONT.DEFAULT, height=22, transformation=i3.Rotation((0.0, 0.0), 0.0)) for i in range(16): elems += i3.PolygonText(layer=i3.Layer(5), coordinate=(500, 507 + i * 30), text=str(300 + i * 50), alignment=(i3.TEXT.ALIGN.CENTER, i3.TEXT.ALIGN.TOP), font=i3.TEXT.FONT.DEFAULT, height=22, transformation=i3.Rotation((0.0, 0.0), 0.0)) elems += i3.PolygonText(layer=i3.Layer(5), coordinate=(4950, 507 + i * 30), text=str(300 + i * 50), alignment=(i3.TEXT.ALIGN.CENTER, i3.TEXT.ALIGN.TOP), font=i3.TEXT.FONT.DEFAULT, height=22, transformation=i3.Rotation((0.0, 0.0), 0.0)) for i in range(16): elems += i3.PolygonText(layer=i3.Layer(5), coordinate=(500, 1017 + i * 30), text=str(300 + i * 50), alignment=(i3.TEXT.ALIGN.CENTER, i3.TEXT.ALIGN.TOP), font=i3.TEXT.FONT.DEFAULT, height=22, transformation=i3.Rotation((0.0, 0.0), 0.0)) elems += i3.PolygonText(layer=i3.Layer(5), coordinate=(4950, 1017 + i * 30), text=str(300 + i * 50), alignment=(i3.TEXT.ALIGN.CENTER, i3.TEXT.ALIGN.TOP), font=i3.TEXT.FONT.DEFAULT, height=22, transformation=i3.Rotation((0.0, 0.0), 0.0)) return elems
class Release(i3.PCell): _name_prefix = "RELEASE" # Center of the structure position = i3.Coord2Property(default=(0.0, 0.0)) # Layer lay_release = i3.Layer(number=4, name="release") layer = i3.LayerProperty(default=lay_release) # Mesa parameters length = i3.PositiveNumberProperty(default=800.0) width = i3.PositiveNumberProperty(default=40.0) release_margin = i3.PositiveNumberProperty(default=12.5) release_tether_period = i3.PositiveNumberProperty(default=45.0) release_tether_length = i3.PositiveNumberProperty(default=17.5) release_tether_width = i3.PositiveNumberProperty(default=8.0) class Layout(i3.LayoutView): def _generate_elements(self, elems): # Center of the structure (x0, y0) = self.position # elems += i3.Rectangle(layer=self.layer, center=(x0, y0), # box_size=(self.length + self.release_margin, self.width + self.release_margin)) elems += i3.Rectangle(layer=self.layer, center=(300, 300), box_size=(200, 200)) rec = i3.Rectangle(layer=self.layer, center=(0, 0), box_size=(200, 200)) layer2 = i3.Layer(2) remove = i3.Wedge(layer=layer2, begin_coord=(-100, 0), end_coord=(-50, 0), begin_width=8, end_width=0.001) elems += rec elems += remove generated1 = self.layer - layer2 mapping = {generated1: self.layer} output_elems = i3.get_elements_for_generated_layers(elems, mapping) # # elems = elems | wedge, # haha = rec | remove, # elems += remove, # # elems +=rec, # elems = elems.extend(haha), return output_elems
class Release(i3.PCell): _name_prefix = "RELEASE" # Layer lay_release = i3.Layer(number=1, name="release") layer = i3.LayerProperty(default=lay_release) # Mesa parameters length = i3.PositiveNumberProperty(default=40.0) width = i3.PositiveNumberProperty(default=8.0) class Layout(i3.LayoutView): def _generate_elements(self, elems): elems += i3.Rectangle(layer=self.layer, center=(0, 0), box_size=(self.length, self.width)) return elems
def _generate_elements(self, elems): # Center of the structure (x0, y0) = self.position # RELEASE c1 = Coupon(length=2750, nb=16) #2750 label A no need for shrink elems += i3.SRef(reference=c1, position=self.position, transformation=i3.Translation( (0, 0)) + i3.Translation((-16000, -25000))) elems += i3.PolygonText(layer=i3.Layer(number=4, name="release"), text="A16", font=2, height=1000.0, transformation=i3.Translation( (45075, -12500))) c2 = Coupon(length=2250, shrink=500, nb=16) elems += i3.SRef(reference=c2, position=self.position, transformation=i3.Translation( (0, 23240)) + i3.Translation( (-16000, -25000))) elems += i3.PolygonText(layer=i3.Layer(number=4, name="release"), text="B16", font=2, height=200.0, transformation=i3.Translation( (35865, 20437.5))) c3 = Coupon(length=1500, shrink=1250, nb=16) elems += i3.SRef(reference=c3, position=self.position, transformation=i3.Translation( (0, 46480)) + i3.Translation( (-16000, -25000))) elems += i3.PolygonText(layer=i3.Layer(number=4, name="release"), text="C16", font=2, height=1000.0, transformation=i3.Translation( (-10000, 46677.5))) c4 = Coupon(length=2750, nb=8) elems += i3.SRef(reference=c4, position=self.position, transformation=i3.Translation((-28000, -38160))) elems += i3.PolygonText(layer=i3.Layer(number=4, name="release"), text="A8", font=2, height=1000.0, transformation=i3.Translation( (32650, -30000))) c5 = Coupon(length=2250, shrink=500, nb=12) elems += i3.SRef(reference=c5, position=self.position, transformation=i3.Rotation(rotation=90) + i3.Translation((-18417.5, -23917.5))) elems += i3.PolygonText(layer=i3.Layer(number=4, name="release"), text="B12", font=2, height=1000.0, transformation=i3.Translation( (-27695, 29707.5))) c6 = Coupon(length=1500, shrink=1250, nb=10) elems += i3.SRef(reference=c6, position=self.position, transformation=i3.Rotation(rotation=90) + i3.Translation((-36617.5, -23917.5))) elems += i3.PolygonText(layer=i3.Layer(number=4, name="release"), text="C10", font=2, height=1000.0, transformation=i3.Translation( (-40000, 18832.5))) c7 = Coupon(length=1500, shrink=1250, nb=10) elems += i3.SRef(reference=c7, position=self.position, transformation=i3.Translation((-22000, -53840))) elems += i3.PolygonText(layer=i3.Layer(number=4, name="release"), text="C10", font=2, height=1000.0, transformation=i3.Translation( (20950, -41500))) c8 = Coupon(length=2250, shrink=500, nb=14) elems += i3.SRef(reference=c8, position=self.position, transformation=i3.Translation((38750, -1760))) elems += i3.PolygonText(layer=i3.Layer(number=4, name="release"), text="B14", font=2, height=1000.0, transformation=i3.Translation( (48000, -3802.5))) c9 = Coupon(length=1500, shrink=1250, nb=14) elems += i3.SRef(reference=c9, position=self.position, transformation=i3.Translation((27500, 21480))) elems += i3.PolygonText(layer=i3.Layer(number=4, name="release"), text="C14", font=2, height=200.0, transformation=i3.Translation( (44000, 20437.5))) elems += i3.Circle(layer=i3.Layer(number=5, name="tether"), center=(0.0, 0.0), radius=50000) return elems
# This example shows how to use Boolean operations on Boundary elements import ipkiss3.all as i3 import matplotlib.pyplot as plt #1. Define two elements circle = i3.Circle(layer=i3.Layer(1), center=(0.0, 0.0), radius=10.0) rectangle = i3.RoundedRectangle(layer=i3.Layer(1), center=(8.0, 7.0), box_size=(12.0, 8.0), radius=1.0) #2. Boolean operations between two shapes # AND, OR, XOR and NOT are supported # Each operation returns a *list* of Boundary elements, so make sure to process them further as a list elems_and = circle & rectangle elems_or = circle | rectangle elems_xor = circle ^ rectangle elems_not = circle - rectangle #3. make a layout with the elements so we can visualize them and save to GDSII layout_original = i3.LayoutCell(name="original").Layout(elements=([circle, rectangle]+elems_and)) layout_and = i3.LayoutCell(name="AND").Layout(elements=elems_and) layout_or = i3.LayoutCell(name="OR").Layout(elements=elems_or) layout_xor = i3.LayoutCell(name="XOR").Layout(elements=elems_xor) layout_not = i3.LayoutCell(name="NOT").Layout(elements=elems_not) layout=i3.LayoutCell(name="boolean_ops_shape").Layout(elements=[ i3.SRef(layout_original, (0.0, 0.0)), i3.SRef(layout_and, (50.0, 0.0)), i3.SRef(layout_or, (100.0, 0.0)), i3.SRef(layout_xor, (150.0, 0.0)), i3.SRef(layout_not, (200.0, 0.0)) ])
# This example shows how to generate elements on generated layers. import ipkiss3.all as i3 # drawn layers layer1 = i3.Layer(1) layer2 = i3.Layer(2) layer3 = i3.Layer(3) # original layout rect = i3.RoundedRectangle(layer=layer3, center=(0.0, 0.0), box_size=(30.0, 30.0), radius=2.0) circle = i3.Circle(layer=layer1, center=(0.0, 0.0), radius=10.0) circle_path = i3.CirclePath(layer=layer2, center=(9.0, 9.0), radius=6.0, line_width=1.0) layout = i3.LayoutCell(name="original").Layout( elements=[rect, circle, circle_path]) layout.visualize() # specify generated layers and the layer to use in the output generated1 = (layer1 ^ layer2) & layer1 generated2 = ~layer3 mapping = {generated1: i3.Layer(10), generated2: i3.Layer(20)} # generated layout output_elems = i3.get_elements_for_generated_layers(layout.layout, mapping)
import ipkiss3.all as i3 # LAYER DEFINITIONS # ----------------- lay_mesa = i3.Layer(number = 0, name = "mesa") lay_quantum_well = i3.Layer(number = 1, name = "quantum well") lay_n_contact = i3.Layer(number = 2, name = "n contact") lay_island = i3.Layer(number = 3, name = "island") lay_release = i3.Layer(number = 4, name = "release") lay_tether = i3.Layer(number = 5, name = "tether") lay_p_contact = i3.Layer(number = 6, name = "p contact") lay_BCB_etch = i3.Layer(number = 7, name = "BCB etch")