From 9e738c759c545f1cd5247717d12ae4f477d98fa5 Mon Sep 17 00:00:00 2001 From: lukasc-ubc Date: Sat, 14 Nov 2015 04:22:18 -0800 Subject: [PATCH] Ring Resonator : rounding fix Convert parameters to integer database, then perform calculations. Avoid floating point errors. --- .../pymacros/SiEPIC_EBeam_PCells.lym | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/klayout_dot_config/pymacros/SiEPIC_EBeam_PCells.lym b/klayout_dot_config/pymacros/SiEPIC_EBeam_PCells.lym index 0c0ec795..8f8c88ec 100644 --- a/klayout_dot_config/pymacros/SiEPIC_EBeam_PCells.lym +++ b/klayout_dot_config/pymacros/SiEPIC_EBeam_PCells.lym @@ -245,31 +245,32 @@ class DoubleBus_Ring(pya.PCellDeclarationHelper): # Create the ring resonator: layout_Ring(self.cell, SiLayerN, self.r+self.w/2, self.r+self.g+self.w, self.r, self.w, self.npoints) -# w = int(round(self.w/dbu)) -# r = int(round(self.r/dbu)) + w = int(round(self.w/dbu)) + r = int(round(self.r/dbu)) + g = int(round(self.g/dbu)) # Create the two waveguides - wg1 = pya.Box(0, -self.w/2/dbu, (self.w+2*self.r)/dbu, self.w/2/dbu) + wg1 = pya.Box(0, -w/2, w+2*r, w/2) self.cell.shapes(SiLayerN).insert(wg1) - y_offset = 2*self.r + 2*self.g + 2*self.w - wg2 = pya.Box(0, round((y_offset-self.w/2)/dbu), round((self.w+2*self.r)/dbu), round((y_offset+self.w/2)/dbu)) + y_offset = 2*r + 2*g + 2*w + wg2 = pya.Box(0, y_offset-w/2, w+2*r, y_offset+w/2) self.cell.shapes(SiLayerN).insert(wg2) # Create the pins, as short paths: - pin_length = 0.2 - pin = pya.Path([pya.Point(0, 0), pya.Point(pin_length/dbu, 0)], self.w/dbu) + pin_length = 200 # database units, = 0.2 microns + pin = pya.Path([pya.Point(0, 0), pya.Point(pin_length, 0)], w) self.cell.shapes(LayerPinRecN).insert(pin) - pin = pya.Path([pya.Point((self.w+2*self.r-pin_length)/dbu, 0), pya.Point((self.w+2*self.r)/dbu, 0)],self.w/dbu ) + pin = pya.Path([pya.Point(w+2*r-pin_length, 0), pya.Point(w+2*r, 0)],w ) self.cell.shapes(LayerPinRecN).insert(pin) - pin = pya.Path([pya.Point(0, (y_offset)/dbu), pya.Point(pin_length/dbu, (y_offset)/dbu)], self.w/dbu) + pin = pya.Path([pya.Point(0, y_offset), pya.Point(pin_length, y_offset)], w) self.cell.shapes(LayerPinRecN).insert(pin) - pin = pya.Path([pya.Point((self.w+2*self.r-pin_length)/dbu, (y_offset)/dbu), pya.Point((self.w+2*self.r)/dbu, (y_offset)/dbu)], self.w/dbu) + pin = pya.Path([pya.Point(w+2*r-pin_length, y_offset), pya.Point(w+2*r, y_offset)], w) self.cell.shapes(LayerPinRecN).insert(pin) # Create the device recognition layer - dev = pya.Box(0, -self.w*3/dbu, (self.w+2*self.r)/dbu, (y_offset+self.w*3)/dbu ) + dev = pya.Box(0, -w*3, w+2*r, y_offset+w*3 ) self.cell.shapes(LayerDevRecN).insert(dev)