set fake-mem LibreSOCMem output q as a Net Output
[soclayout.git] / experiments9 / LibreSOCMem.py
index 82065061385438f6bfc053a924c5d7b3cf00eecb..3bb757d3817012908a489ed07c3c50dc3106f9a0 100644 (file)
@@ -22,7 +22,7 @@ def createRL(tech, net, layer, coords):
     Rectilinear.create(net, tech.getLayer(layer), coords)
 
 def _routing():
-    return
+    return # all commented-out for now
     af = CRL.AllianceFramework.get()
     db = DataBase.getDB()
     tech = db.getTechnology()
@@ -208,29 +208,55 @@ def _load():
 
     lib = Library.create(rootlib, 'LibreSOCMem')
 
-    cell = Cell.create(lib, 'real_sram')
+    cell = Cell.create(lib, 'spblock_512w64b8w')
+    space = 0.1
+
     with UpdateSession():
         cell.setAbutmentBox(Box(
-            u(0.0), u(0.0), u(16.0), u(40.0),
+            #u(0.0), u(0.0), u(110.025), u(2.025),
+            u(0.0), u(0.0), u(space*1000), u(space*25),
         ))
         nets = {
             '*': Net.create(cell, '*'),
             'clk': Net.create(cell, 'clk'),
-            'i0': Net.create(cell, 'i0'),
-            'i1': Net.create(cell, 'i1'),
-            'q': Net.create(cell, 'q'),
-            'vdd': Net.create(cell, 'vdd'),
-            'vss': Net.create(cell, 'vss'),
+            #'vdd': Net.create(cell, 'vdd'),
+            #'vss': Net.create(cell, 'vss'),
         }
-        for name, qty in (('a', 8),
-                          ('d', 63),
-                          ('q', 63),
+        for name, qty in (('a', 9),
+                          ('d', 64),
+                          ('q', 64),
                           ('we', 8),
                       ):
             for i in range(qty):
                 cname = "%s(%d)" % (name, i)
                 nets[cname] = Net.create(cell, cname)
 
+        # create series of stepped pins
+        x = space*20
+        wid = space
+        step = wid*5
+        for name, qty in (('a', 9),
+                          ('d', 64),
+                          ('q', 64),
+                          ('we', 8),
+                      ):
+            for i in range(qty):
+                cname = "%s(%d)" % (name, i)
+                net = nets[cname]
+                pin = Vertical.create(
+                    net, tech.getLayer('metal1'),
+                    u(x), u(wid), u(0), u(space*25),
+                )
+                x += step
+                net.setExternal(True)
+                NetExternalComponents.setExternal(pin)
+                # q is an output, has to be explicitly set as output
+                # everything else can kinda get away with not being set
+                if name == 'q':
+                    net.setDirection( Net.Direction.OUT )
+            # separate the pin groups
+            x += step * 3
+
         net = nets['*']
         createRL(
             tech, net, 'active',
@@ -277,124 +303,102 @@ def _load():
             tech, net, 'pimplant',
             ((0.115,0.195),(0.115,0.365),(0.285,0.365),(0.285,0.195),(0.115,0.195)),
         )
-        net = nets['vss']
-        createRL(
-            tech, net, 'pwell',
-            ((-0.12,-0.32),(-0.12,1.92),(1.72,1.92),(1.72,-0.32),(-0.12,-0.32)),
-        )
-        createRL(
-            tech, net, 'metal1',
-            ((0.0,0.0),(0.0,0.48),(1.6,0.48),(1.6,0.0),(0.0,0.0)),
-        )
         if False:
-            Vertical.create(
-                net, tech.getLayer('metal1.pin'),
+            net = nets['vss']
+            createRL(
+                tech, net, 'pwell',
+                ((-0.12,-0.32),(-0.12,1.92),(1.72,1.92),(1.72,-0.32),(-0.12,-0.32)),
+            )
+            createRL(
+                tech, net, 'metal1',
+                ((0.0,0.0),(0.0,0.48),(1.6,0.48),(1.6,0.0),(0.0,0.0)),
+            )
+            if False:
+                Vertical.create(
+                    net, tech.getLayer('metal1.pin'),
+                    u(0.8), u(1.6), u(0.0), u(0.48),
+                )
+            pin = Vertical.create(
+                net, tech.getLayer('metal1'),
                 u(0.8), u(1.6), u(0.0), u(0.48),
             )
-        pin = Vertical.create(
-            net, tech.getLayer('metal1'),
-            u(0.8), u(1.6), u(0.0), u(0.48),
-        )
-        net.setExternal(True)
-        NetExternalComponents.setExternal(pin)
-        createRL(
-            tech, net, 'active',
-            ((0.12,0.2),(0.12,0.36),(0.28,0.36),(0.28,0.2),(0.12,0.2)),
-        )
-        createRL(
-            tech, net, 'active',
-            ((0.9625,0.3075),(1.0375,0.3075),(1.0375,0.3825),(0.9625,0.3825),(0.9625,0.3075)),
-        )
-        createRL(
-            tech, net, 'contact',
-            ((0.1675,0.2475),(0.2325,0.2475),(0.2325,0.3125),(0.1675,0.3125),(0.1675,0.2475)),
-        )
-        createRL(
-            tech, net, 'contact',
-            ((0.9675,0.3125),(1.0325,0.3125),(1.0325,0.3775),(0.9675,0.3775),(0.9675,0.3125)),
-        )
+            net.setExternal(True)
+            NetExternalComponents.setExternal(pin)
+            createRL(
+                tech, net, 'active',
+                ((0.12,0.2),(0.12,0.36),(0.28,0.36),(0.28,0.2),(0.12,0.2)),
+            )
+            createRL(
+                tech, net, 'active',
+                ((0.9625,0.3075),(1.0375,0.3075),(1.0375,0.3825),(0.9625,0.3825),(0.9625,0.3075)),
+            )
+            createRL(
+                tech, net, 'contact',
+                ((0.1675,0.2475),(0.2325,0.2475),(0.2325,0.3125),(0.1675,0.3125),(0.1675,0.2475)),
+            )
+            createRL(
+                tech, net, 'contact',
+                ((0.9675,0.3125),(1.0325,0.3125),(1.0325,0.3775),(0.9675,0.3775),(0.9675,0.3125)),
+            )
         net = nets['*']
         createRL(
             tech, net, 'active',
             ((1.105,3.8),(1.4375,3.8),(1.4375,2.2),(0.9625,2.2),(0.9625,3.8),(1.105,3.8)),
         )
-        net = nets['vdd']
-        createRL(
-            tech, net, 'nwell',
-            ((-0.12,1.92),(-0.12,4.32),(1.72,4.32),(1.72,1.92),(-0.12,1.92)),
-        )
-        createRL(
-            tech, net, 'metal1',
-            ((0.0,3.52),(0.0,4.0),(1.6,4.0),(1.6,3.52),(0.0,3.52)),
-        )
         if False:
-            Vertical.create(
-                net, tech.getLayer('metal1.pin'),
+            net = nets['vdd']
+            createRL(
+                tech, net, 'nwell',
+                ((-0.12,1.92),(-0.12,4.32),(1.72,4.32),(1.72,1.92),(-0.12,1.92)),
+            )
+            createRL(
+                tech, net, 'metal1',
+                ((0.0,3.52),(0.0,4.0),(1.6,4.0),(1.6,3.52),(0.0,3.52)),
+            )
+            if False:
+                Vertical.create(
+                    net, tech.getLayer('metal1.pin'),
+                    u(0.8), u(1.6), u(3.52), u(4.0),
+                )
+            pin = Vertical.create(
+                net, tech.getLayer('metal1'),
                 u(0.8), u(1.6), u(3.52), u(4.0),
             )
-        pin = Vertical.create(
-            net, tech.getLayer('metal1'),
-            u(0.8), u(1.6), u(3.52), u(4.0),
-        )
-        net.setExternal(True)
-        NetExternalComponents.setExternal(pin)
-        createRL(
-            tech, net, 'active',
-            ((0.52,3.6),(0.52,3.76),(0.68,3.76),(0.68,3.6),(0.52,3.6)),
-        )
-        createRL(
-            tech, net, 'active',
-            ((0.9625,3.5675),(1.0375,3.5675),(1.0375,3.7825),(0.9625,3.7825),(0.9625,3.5675)),
-        )
-        createRL(
-            tech, net, 'active',
-            ((0.1625,3.6025),(0.2375,3.6025),(0.2375,3.6775),(0.1625,3.6775),(0.1625,3.6025)),
-        )
-        createRL(
-            tech, net, 'contact',
-            ((0.5675,3.6475),(0.6325,3.6475),(0.6325,3.7125),(0.5675,3.7125),(0.5675,3.6475)),
-        )
-        createRL(
-            tech, net, 'contact',
-            ((0.9675,3.5725),(1.0325,3.5725),(1.0325,3.6375),(0.9675,3.6375),(0.9675,3.5725)),
-        )
-        createRL(
-            tech, net, 'contact',
-            ((0.9675,3.7125),(1.0325,3.7125),(1.0325,3.7775),(0.9675,3.7775),(0.9675,3.7125)),
-        )
-        createRL(
-            tech, net, 'contact',
-            ((0.1675,3.6075),(0.2325,3.6075),(0.2325,3.6725),(0.1675,3.6725),(0.1675,3.6075)),
-        )
+            net.setExternal(True)
+            NetExternalComponents.setExternal(pin)
+            createRL(
+                tech, net, 'active',
+                ((0.52,3.6),(0.52,3.76),(0.68,3.76),(0.68,3.6),(0.52,3.6)),
+            )
+            createRL(
+                tech, net, 'active',
+                ((0.9625,3.5675),(1.0375,3.5675),(1.0375,3.7825),(0.9625,3.7825),(0.9625,3.5675)),
+            )
+            createRL(
+                tech, net, 'active',
+                ((0.1625,3.6025),(0.2375,3.6025),(0.2375,3.6775),(0.1625,3.6775),(0.1625,3.6025)),
+            )
+            createRL(
+                tech, net, 'contact',
+                ((0.5675,3.6475),(0.6325,3.6475),(0.6325,3.7125),(0.5675,3.7125),(0.5675,3.6475)),
+            )
+            createRL(
+                tech, net, 'contact',
+                ((0.9675,3.5725),(1.0325,3.5725),(1.0325,3.6375),(0.9675,3.6375),(0.9675,3.5725)),
+            )
+            createRL(
+                tech, net, 'contact',
+                ((0.9675,3.7125),(1.0325,3.7125),(1.0325,3.7775),(0.9675,3.7775),(0.9675,3.7125)),
+            )
+            createRL(
+                tech, net, 'contact',
+                ((0.1675,3.6075),(0.2325,3.6075),(0.2325,3.6725),(0.1675,3.6725),(0.1675,3.6075)),
+            )
         net = nets['*']
         createRL(
             tech, net, 'active',
             ((0.305,1.38),(0.495,1.38),(0.495,0.62),(0.1625,0.62),(0.1625,1.38),(0.305,1.38)),
         )
-        net = nets['i0']
-        createRL(
-            tech, net, 'poly',
-            ((0.425,1.385),(0.425,0.565),(0.375,0.565),(0.375,1.9625),(0.2025,1.9625),(0.2025,2.0375),(0.375,2.0375),(0.375,3.455),(0.425,3.455),(0.425,1.385)),
-        )
-        createRL(
-            tech, net, 'metal1',
-            ((0.2325,1.9325),(0.2325,1.4125),(0.1675,1.4125),(0.1675,3.455),(0.2325,3.455),(0.2325,2.0675),(0.2725,2.0675),(0.2725,1.9325),(0.2325,1.9325)),
-        )
-        if False:
-            Vertical.create(
-                net, tech.getLayer('metal1.pin'),
-                u(0.2), u(0.065), u(1.4125), u(3.455),
-            )
-        pin = Vertical.create(
-            net, tech.getLayer('metal1'),
-            u(0.2), u(0.065), u(1.4125), u(3.455),
-        )
-        net.setExternal(True)
-        NetExternalComponents.setExternal(pin)
-        createRL(
-            tech, net, 'contact',
-            ((0.2075,1.9675),(0.2725,1.9675),(0.2725,2.0325),(0.2075,2.0325),(0.2075,1.9675)),
-        )
         net = nets['*']
         createRL(
             tech, net, 'active',
@@ -405,7 +409,7 @@ def _load():
             tech, net, 'active',
             ((0.705,1.0),(1.0375,1.0),(1.0375,0.24),(0.555,0.24),(0.555,1.0),(0.705,1.0)),
         )
-        net = nets['i1']
+        net = nets['clk']
         createRL(
             tech, net, 'poly',
             ((0.775,0.185),(0.775,1.2375),(0.9975,1.2375),(0.9975,1.1625),(0.825,1.1625),(0.825,0.185),(0.775,0.185)),
@@ -421,11 +425,11 @@ def _load():
         if False:
             Vertical.create(
                 net, tech.getLayer('metal1.pin'),
-                u(1.0), u(0.065), u(0.545), u(3.455),
+                u(1.0), u(0.065), u(0), u(3.455),
             )
         pin = Vertical.create(
             net, tech.getLayer('metal1'),
-            u(1.0), u(0.065), u(0.545), u(3.455),
+            u(1.0), u(0.065), u(0), u(3.455),
         )
         net.setExternal(True)
         NetExternalComponents.setExternal(pin)
@@ -442,78 +446,6 @@ def _load():
             tech, net, 'active',
             ((0.775,2.6),(0.705,2.6),(0.705,3.4),(0.955,3.4),(0.955,3.7825),(1.045,3.7825),(1.045,2.6),(0.775,2.6)),
         )
-        net = nets['q']
-        createRL(
-            tech, net, 'metal1',
-            ((1.4325,2.185),(1.4325,0.545),(1.3675,0.545),(1.3675,3.455),(1.4325,3.455),(1.4325,2.185)),
-        )
-        if False:
-            Vertical.create(
-                net, tech.getLayer('metal1.pin'),
-                u(1.4), u(0.065), u(0.545), u(3.455),
-            )
-        pin = Vertical.create(
-            net, tech.getLayer('metal1'),
-            u(1.4), u(0.065), u(0.545), u(3.455),
-        )
-        net.setExternal(True)
-        NetExternalComponents.setExternal(pin)
-        createRL(
-            tech, net, 'active',
-            ((1.3625,2.215),(1.4375,2.215),(1.4375,3.41),(1.3625,3.41),(1.3625,2.215)),
-        )
-        createRL(
-            tech, net, 'active',
-            ((1.3625,0.61),(1.4375,0.61),(1.4375,0.965),(1.3625,0.965),(1.3625,0.61)),
-        )
-        createRL(
-            tech, net, 'contact',
-            ((1.3675,2.22),(1.4325,2.22),(1.4325,2.285),(1.3675,2.285),(1.3675,2.22)),
-        )
-        createRL(
-            tech, net, 'contact',
-            ((1.3675,2.36),(1.4325,2.36),(1.4325,2.425),(1.3675,2.425),(1.3675,2.36)),
-        )
-        createRL(
-            tech, net, 'contact',
-            ((1.3675,2.5),(1.4325,2.5),(1.4325,2.565),(1.3675,2.565),(1.3675,2.5)),
-        )
-        createRL(
-            tech, net, 'contact',
-            ((1.3675,2.64),(1.4325,2.64),(1.4325,2.705),(1.3675,2.705),(1.3675,2.64)),
-        )
-        createRL(
-            tech, net, 'contact',
-            ((1.3675,2.78),(1.4325,2.78),(1.4325,2.845),(1.3675,2.845),(1.3675,2.78)),
-        )
-        createRL(
-            tech, net, 'contact',
-            ((1.3675,2.92),(1.4325,2.92),(1.4325,2.985),(1.3675,2.985),(1.3675,2.92)),
-        )
-        createRL(
-            tech, net, 'contact',
-            ((1.3675,3.06),(1.4325,3.06),(1.4325,3.125),(1.3675,3.125),(1.3675,3.06)),
-        )
-        createRL(
-            tech, net, 'contact',
-            ((1.3675,3.2),(1.4325,3.2),(1.4325,3.265),(1.3675,3.265),(1.3675,3.2)),
-        )
-        createRL(
-            tech, net, 'contact',
-            ((1.3675,3.34),(1.4325,3.34),(1.4325,3.405),(1.3675,3.405),(1.3675,3.34)),
-        )
-        createRL(
-            tech, net, 'contact',
-            ((1.3675,0.615),(1.4325,0.615),(1.4325,0.68),(1.3675,0.68),(1.3675,0.615)),
-        )
-        createRL(
-            tech, net, 'contact',
-            ((1.3675,0.755),(1.4325,0.755),(1.4325,0.82),(1.3675,0.82),(1.3675,0.755)),
-        )
-        createRL(
-            tech, net, 'contact',
-            ((1.3675,0.895),(1.4325,0.895),(1.4325,0.96),(1.3675,0.96),(1.3675,0.895)),
-        )
 
 
     af.wrapLibrary(lib, 0)