Implement automatic AB.
authorJock Tanner <tanner.of.kha@gmail.com>
Mon, 6 Apr 2020 03:48:13 +0000 (03:48 +0000)
committerJock Tanner <tanner.of.kha@gmail.com>
Mon, 6 Apr 2020 03:48:13 +0000 (03:48 +0000)
experiments7/doAlu16.py
experiments7/utils.py

index 1c1b61605ec9422ce9e88af57501fdbe6d9ac197..5116f67f08ad644a555a945c18431576020b6643 100755 (executable)
@@ -47,7 +47,7 @@ class AddSub(Module):
         """ Main routine. """
 
         with SessionManager():
-            self.init_abutment_box()
+            self.compute_ab()
             self.create_pins()
 
         if self.editor:
@@ -75,7 +75,7 @@ class ALU16(Module):
             return False
 
         with SessionManager():
-            self.init_abutment_box()
+            self.init_ab()
             self.place_submodules()
 
             # TODO: replace with some form of lazy evaluation?
@@ -99,7 +99,7 @@ class ALU16(Module):
         # then route (globally)
         # this connects up not just in the remaining (little) cells,
         # it connects *to add and sub and the outside world as well*
-        self.init_abutment_box()
+        self.init_ab()
         result = self.place_and_route()
 
         self.save()
@@ -110,7 +110,7 @@ def ScriptMain(editor=None, **kwargs):
     coriolis_setup()
 
     add = AddSub(
-        'add', editor, width=350.0, height=400.0,
+        'add', editor,
         north_pins=[
             {'net': 'a({})', 'x': 10.0, 'delta': 20.0, 'repeat': BIT_WIDTH},
             {'net': 'b({})', 'x': 20.0, 'delta': 20.0, 'repeat': BIT_WIDTH},
@@ -125,7 +125,7 @@ def ScriptMain(editor=None, **kwargs):
         },
     )
     sub = AddSub(
-        'sub', editor, width=350.0, height=400.0,
+        'sub', editor,
         north_pins=[
             {'net': 'a({})', 'x': 10.0, 'delta': 20.0, 'repeat': BIT_WIDTH},
             {'net': 'b({})', 'x': 20.0, 'delta': 20.0, 'repeat': BIT_WIDTH},
index 60057f63810942bcfce160234db1c9eafe0ba5ba..af4368dd29591edeb58eb6ae42ba6a6a88df9e76 100644 (file)
@@ -135,6 +135,12 @@ class Module(object):
         """
         return DbU.toLambda(dbu)
 
+    def compute_ab(self):
+        """ Compute default abutment box without placement. """
+        etesian = Etesian.EtesianEngine.create(self.cell)
+        etesian.setDefaultAb()
+        etesian.destroy()
+
     def place(self):
         """ Places the current cell. """
         etesian = Etesian.EtesianEngine.create(self.cell)
@@ -190,7 +196,11 @@ class Module(object):
 
         if isinstance(repeat, int):
             if repeat > 1 and delta == 0.0:
-                raise Warning('You are trying to place pins on each other.')
+                raise Warning(
+                    '{}: you are trying to place pins on each other.'.format(
+                        self.name
+                    )
+                )
             iterator = range(repeat)
         else:
             iterator = repeat
@@ -215,10 +225,14 @@ class Module(object):
 
         return x, y
 
-    def init_abutment_box(self):
+    def init_ab(self):
         """ Create the abutment box with object's initial values. """
-
-        self.ab = Box(0, 0, self.to_dbu(self.width), self.to_dbu(self.height))
+        if self.width and self.height:
+            self.ab = Box(
+                0, 0, self.to_dbu(self.width), self.to_dbu(self.height)
+            )
+        else:
+            raise Warning('{}: Module size is not set.'.format(self.name))
 
     def create_pins(self):
         """ Creates all pins set on Module object creation. """
@@ -317,6 +331,7 @@ class Module(object):
 
         raise NotImplementedError('You need to implement the `build` method.')
 
+
 class Config:
 
     def __init__(self, priority=None):