From c3769bd37531c03e4e4854e7ebbfa8d679a7d6a3 Mon Sep 17 00:00:00 2001 From: Matt Guthaus Date: Wed, 24 May 2017 10:50:19 -0700 Subject: [PATCH] Added new scmos test with a bigger design. Added error checks for not found label and not found pin shapes. --- compiler/gdsMill/gdsMill/vlsiLayout.py | 13 ++- compiler/router/router.py | 6 ++ compiler/router/tests/07_big_scmos_test.gds | Bin 0 -> 387072 bytes compiler/router/tests/07_big_scmos_test.py | 86 ++++++++++++++++++++ 4 files changed, 101 insertions(+), 4 deletions(-) create mode 100644 compiler/router/tests/07_big_scmos_test.gds create mode 100644 compiler/router/tests/07_big_scmos_test.py diff --git a/compiler/gdsMill/gdsMill/vlsiLayout.py b/compiler/gdsMill/gdsMill/vlsiLayout.py index 422185f8..d4075378 100644 --- a/compiler/gdsMill/gdsMill/vlsiLayout.py +++ b/compiler/gdsMill/gdsMill/vlsiLayout.py @@ -2,6 +2,7 @@ from gdsPrimitives import * from datetime import * import mpmath import gdsPrimitives +import debug class VlsiLayout: """Class represent a hierarchical layout""" @@ -252,7 +253,8 @@ class VlsiLayout: Method to change the root pointer to another layout. """ - if self.debug: print "DEBUG: GdsMill vlsiLayout: changeRoot: %s "%newRoot + if self.debug: + debug.info(0,"DEBUG: GdsMill vlsiLayout: changeRoot: %s "%newRoot) # Determine if newRoot exists # layoutToAdd (default) or nameOfLayout @@ -272,7 +274,7 @@ class VlsiLayout: """ offsetInLayoutUnits = (self.userUnits(offsetInMicrons[0]),self.userUnits(offsetInMicrons[1])) if self.debug==1: - print "DEBUG: GdsMill vlsiLayout: addInstance: type %s, nameOfLayout "%type(layoutToAdd),nameOfLayout + debug.info(0,"DEBUG: GdsMill vlsiLayout: addInstance: type %s, nameOfLayout "%type(layoutToAdd),nameOfLayout) @@ -286,7 +288,8 @@ class VlsiLayout: StructureFound = False for structure in layoutToAdd.structures: if StructureName in structure: - if self.debug: print "DEBUG: Structure %s Found"%StructureName + if self.debug: + debug.info(1,"DEBUG: Structure %s Found"%StructureName) StructureFound = True @@ -581,7 +584,8 @@ class VlsiLayout: def getLayoutBorder(self,borderlayer): for boundary in self.structures[self.rootStructureName].boundaries: if boundary.drawingLayer==borderlayer: - if self.debug: print "Find border "+str(boundary.coordinates) + if self.debug: + debug.info(1,"Find border "+str(boundary.coordinates)) left_bottom=boundary.coordinates[0] right_top=boundary.coordinates[2] cellSize=[right_top[0]-left_bottom[0],right_top[1]-left_bottom[1]] @@ -658,6 +662,7 @@ class VlsiLayout: label_layer = Text.drawingLayer label_coordinate = Text.coordinates[0] + debug.check(label_layer!=None,"Did not find label {0}.".format(label_name)) return (label_coordinate, label_layer) diff --git a/compiler/router/router.py b/compiler/router/router.py index f5daaac7..1c4ef796 100644 --- a/compiler/router/router.py +++ b/compiler/router/router.py @@ -99,6 +99,8 @@ class router: # repack the shape as a pair of vectors rather than four values new_pin_shapes.append([vector(pin_shape[0],pin_shape[1]),vector(pin_shape[2],pin_shape[3])]) + debug.check(len(new_pin_shapes)>0,"Did not find any pin shapes for {0}.".format(str(pin))) + return (pin_layer,new_pin_shapes) def find_blockages(self): @@ -295,8 +297,10 @@ class router: Mark the grids that are in the pin rectangle ranges to have the source property. """ (pin_layer,self.source_pin_shapes) = self.find_pin(src) + zindex = 0 if pin_layer==self.horiz_layer_number else 1 self.source_pin_zindex = zindex + for shape in self.source_pin_shapes: shape_in_tracks=self.convert_shape_to_tracks(shape) debug.info(1,"Set source: " + str(src) + " " + str(shape_in_tracks) + " z=" + str(zindex)) @@ -308,8 +312,10 @@ class router: Mark the grids that are in the pin rectangle ranges to have the target property. """ (pin_layer,self.target_pin_shapes) = self.find_pin(src) + zindex = 0 if pin_layer==self.horiz_layer_number else 1 self.target_pin_zindex = zindex + for shape in self.target_pin_shapes: shape_in_tracks=self.convert_shape_to_tracks(shape) debug.info(1,"Set target: " + str(src) + " " + str(shape_in_tracks) + " z=" + str(zindex)) diff --git a/compiler/router/tests/07_big_scmos_test.gds b/compiler/router/tests/07_big_scmos_test.gds new file mode 100644 index 0000000000000000000000000000000000000000..3c8e12a84b6833c7500a70e738636f0e4f025dc1 GIT binary patch literal 387072 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 literal 0 HcmV?d00001 diff --git a/compiler/router/tests/07_big_scmos_test.py b/compiler/router/tests/07_big_scmos_test.py new file mode 100644 index 00000000..83086327 --- /dev/null +++ b/compiler/router/tests/07_big_scmos_test.py @@ -0,0 +1,86 @@ +#!/usr/bin/env python2.7 +"Run a regresion test the library cells for DRC" + +import unittest +from testutils import header +import sys,os +sys.path.append(os.path.join(sys.path[0],"../..")) +sys.path.append(os.path.join(sys.path[0],"..")) +import globals +import debug +import calibre + +OPTS = globals.OPTS + +class big_scmos_test(unittest.TestCase): + """ + Simplest two pin route test with no blockages using the pin locations instead of labels. + """ + + def runTest(self): + globals.init_openram("config_{0}".format(OPTS.tech_name)) + + import design + import router + + class gdscell(design.design): + """ + A generic GDS design that we can route on. + """ + def __init__(self, name): + #design.design.__init__(self, name) + debug.info(2, "Create {0} object".format(name)) + self.name = name + self.gds_file = "{0}/{1}.gds".format(os.path.dirname(os.path.realpath(__file__)),name) + self.sp_file = "{0}/{1}.sp".format(os.path.dirname(os.path.realpath(__file__)),name) + design.hierarchy_layout.layout.__init__(self, name) + design.hierarchy_spice.spice.__init__(self, name) + + class routing(design.design): + """ + A generic GDS design that we can route on. + """ + def __init__(self, name, gdsname): + design.design.__init__(self, name) + debug.info(2, "Create {0} object".format(name)) + + cell = gdscell(gdsname) + self.add_inst(name=gdsname, + mod=cell, + offset=[0,0]) + self.connect_inst([]) + + self.gdsname = "{0}/{1}.gds".format(os.path.dirname(os.path.realpath(__file__)),gdsname) + r=router.router(self.gdsname) + layer_stack =("metal3","via2","metal2") + # first pin doesn't overlap a rectangle + #r.route(layer_stack,src="a_2_7",dest="B") + r.route(layer_stack,src="A",dest="B") + r.add_route(self) + + if OPTS.tech_name=="scn3me_subm": + r = routing("test1", "07_big_scmos_test") + self.local_check(r) + else: + debug.warning("Test must be run in scn3me_subm") + + # fails if there are any DRC errors on any cells + globals.end_openram() + + + def local_check(self, r): + tempgds = OPTS.openram_temp + "temp.gds" + r.gds_write(tempgds) + self.assertFalse(calibre.run_drc(r.name, tempgds)) + os.remove(tempgds) + + + + + +# instantiate a copy of the class to actually run the test +if __name__ == "__main__": + (OPTS, args) = globals.parse_args() + del sys.argv[1:] + header(__file__, OPTS.tech_name) + unittest.main()