Пример #1
0
    def local_check(self, a, final_verification=False):

        tempspice = OPTS.openram_temp + "temp.sp"
        tempgds = OPTS.openram_temp + "temp.gds"

        a.sp_write(tempspice)
        a.gds_write(tempgds)

        import verify
        try:
            self.assertTrue(verify.run_drc(a.name, tempgds)==0)
        except:
            self.reset()
            self.fail("DRC failed: {}".format(a.name))

            
        try:
            self.assertTrue(verify.run_lvs(a.name, tempgds, tempspice, final_verification)==0)
        except:
            self.reset()
            self.fail("LVS mismatch: {}".format(a.name))

        self.reset()
        if OPTS.purge_temp:
            self.cleanup()
Пример #2
0
    def LVS(self, final_verification=False):
        """Checks LVS for a module"""
        import verify

        # Unit tests will check themselves.
        # Do not run if disabled in options.

        # No layout to check
        if OPTS.netlist_only:
            return
        elif (not OPTS.is_unit_test and OPTS.check_lvsdrc
              and (OPTS.inline_lvsdrc or final_verification)):
            tempspice = "{0}/{1}.sp".format(OPTS.openram_temp, self.name)
            tempgds = "{0}/{1}.gds".format(OPTS.openram_temp, self.name)
            self.lvs_write(tempspice)
            self.gds_write(tempgds)
            num_errors = verify.run_lvs(self.name,
                                        tempgds,
                                        tempspice,
                                        final_verification=final_verification)
            debug.check(
                num_errors == 0, "LVS failed for {0} with {1} error(s)".format(
                    self.name, num_errors))
            if OPTS.purge_temp:
                os.remove(tempspice)
                os.remove(tempgds)
Пример #3
0
    def local_check(self, a, final_verification=False):

        self.reset()

        tempspice = "{0}{1}.sp".format(OPTS.openram_temp,a.name)
        tempgds = "{0}{1}.gds".format(OPTS.openram_temp,a.name)

        a.sp_write(tempspice)
        # cannot write gds in netlist_only mode
        if not OPTS.netlist_only:
            a.gds_write(tempgds)

            import verify
            result=verify.run_drc(a.name, tempgds, extract=True, final_verification=final_verification)
            if result != 0:
                #zip_file = "/tmp/{0}_{1}".format(a.name,os.getpid())
                #debug.info(0,"Archiving failed files to {}.zip".format(zip_file))
                #shutil.make_archive(zip_file, 'zip', OPTS.openram_temp)
                self.fail("DRC failed: {}".format(a.name))


            result=verify.run_lvs(a.name, tempgds, tempspice, final_verification=final_verification)
            if result != 0:
                #zip_file = "/tmp/{0}_{1}".format(a.name,os.getpid())
                #debug.info(0,"Archiving failed files to {}.zip".format(zip_file))
                #shutil.make_archive(zip_file, 'zip', OPTS.openram_temp)
                self.fail("LVS mismatch: {}".format(a.name))

        # For debug...
        #import pdb; pdb.set_trace()
        if OPTS.purge_temp:
            self.cleanup()
Пример #4
0
    def runTest(self):
        globals.init_openram("config_{0}".format(OPTS.tech_name))
        import verify

        (gds_dir, sp_dir, allnames) = setup_files()
        drc_errors = 0
        lvs_errors = 0
        debug.info(1, "Performing LVS on: " + ", ".join(allnames))

        for f in allnames:
            gds_name = "{0}/{1}.gds".format(gds_dir, f)
            sp_name = "{0}/{1}.sp".format(sp_dir, f)
            name = re.sub('\.gds$', '', f)
            if not os.path.isfile(gds_name):
                lvs_errors += 1
                debug.error("Missing GDS file {}".format(gds_name))
            if not os.path.isfile(sp_name):
                lvs_errors += 1
                debug.error("Missing SPICE file {}".format(gds_name))
            drc_errors += verify.run_drc(name, gds_name)
            lvs_errors += verify.run_lvs(f, gds_name, sp_name)

        # fail if the error count is not zero
        self.assertEqual(drc_errors + lvs_errors, 0)
        globals.end_openram()
Пример #5
0
    def DRC_LVS(self, final_verification=False, top_level=False):
        """Checks both DRC and LVS for a module"""
        
        # Final verification option does not allow nets to be connected by label.
        # Unit tests will check themselves.
        if OPTS.is_unit_test:
            return
        if not OPTS.check_lvsdrc:
            return
        # Do not run if disabled in options.
        if (OPTS.inline_lvsdrc or top_level):

            global total_drc_errors
            global total_lvs_errors
            tempspice = "{0}/{1}.sp".format(OPTS.openram_temp,self.name)
            tempgds = "{0}/{1}.gds".format(OPTS.openram_temp,self.name)
            self.sp_write(tempspice)
            self.gds_write(tempgds)

            num_drc_errors = verify.run_drc(self.name, tempgds, final_verification) 
            num_lvs_errors = verify.run_lvs(self.name, tempgds, tempspice, final_verification) 
            debug.check(num_drc_errors == 0,"DRC failed for {0} with {1} error(s)".format(self.name,num_drc_errors))
            debug.check(num_lvs_errors == 0,"LVS failed for {0} with {1} errors(s)".format(self.name,num_lvs_errors))
            total_drc_errors += num_drc_errors
            total_lvs_errors += num_lvs_errors

            os.remove(tempspice)
            os.remove(tempgds)
Пример #6
0
    def local_check(self, tx):
        tempspice = OPTS.openram_temp + "temp.sp"
        tempgds = OPTS.openram_temp + "temp.gds"

        tx.sp_write(tempspice)
        tx.gds_write(tempgds)

        self.assertFalse(verify.run_drc(tx.name, tempgds))
        self.assertFalse(verify.run_lvs(tx.name, tempgds, tempspice))

        os.remove(tempspice)
        os.remove(tempgds)
Пример #7
0
 def LVS(self):
     """Checks LVS for a module"""
     if OPTS.check_lvsdrc:
         tempspice = OPTS.openram_temp + "/temp.sp"
         tempgds = OPTS.openram_temp + "/temp.gds"
         self.sp_write(tempspice)
         self.gds_write(tempgds)
         debug.check(
             verify.run_lvs(self.name, tempgds, tempspice) == 0,
             "LVS failed for {0}".format(self.name))
         os.remove(tempspice)
         os.remove(tempgds)
Пример #8
0
    def local_check(self, a, final_verification=False):

        self.reset()

        tempspice = "{}.sp".format(a.name)
        tempgds = "{}.gds".format(a.name)

        a.lvs_write("{0}{1}".format(OPTS.openram_temp, tempspice))
        # cannot write gds in netlist_only mode
        if not OPTS.netlist_only:
            a.gds_write("{0}{1}".format(OPTS.openram_temp, tempgds))

            import verify
            # Run both DRC and LVS even if DRC might fail
            # Magic can still extract despite DRC failing, so it might be ok in some techs
            # if we ignore things like minimum metal area of pins
            drc_result = verify.run_drc(a.name,
                                        tempgds,
                                        tempspice,
                                        extract=True,
                                        final_verification=final_verification)

            # We can still run LVS even if DRC fails in Magic OR Calibre
            lvs_result = verify.run_lvs(a.name,
                                        tempgds,
                                        tempspice,
                                        final_verification=final_verification)

            # Only allow DRC to fail and LVS to pass if we are using magic
            if lvs_result == 0 and drc_result != 0:
                # import shutil
                # zip_file = "/tmp/{0}_{1}".format(a.name, os.getpid())
                # debug.info(0, "Archiving failed files to {}.zip".format(zip_file))
                # shutil.make_archive(zip_file, 'zip', OPTS.openram_temp)
                self.fail("DRC failed but LVS passed: {}".format(a.name))
            elif drc_result != 0:
                # import shutil
                # zip_file = "/tmp/{0}_{1}".format(a.name, os.getpid())
                # debug.info(0,"Archiving failed files to {}.zip".format(zip_file))
                # shutil.make_archive(zip_file, 'zip', OPTS.openram_temp)
                self.fail("DRC failed: {}".format(a.name))

            if lvs_result != 0:
                # import shutil
                # zip_file = "/tmp/{0}_{1}".format(a.name, os.getpid())
                # debug.info(0,"Archiving failed files to {}.zip".format(zip_file))
                # shutil.make_archive(zip_file, 'zip', OPTS.openram_temp)
                self.fail("LVS mismatch: {}".format(a.name))

        # For debug...
        # import pdb; pdb.set_trace()
        if not OPTS.keep_temp:
            self.cleanup()
Пример #9
0
    def local_check(self, a):
        tempspice = OPTS.openram_temp + "temp.sp"
        tempgds = OPTS.openram_temp + "temp.gds"

        a.sp_write(tempspice)
        a.gds_write(tempgds)

        self.assertFalse(verify.run_drc(a.name, tempgds))
        self.assertFalse(verify.run_lvs(a.name, tempgds, tempspice))
        #self.assertFalse(verify.run_pex(a.name, tempgds, tempspice, output=OPTS.openram_temp+"temp_pex.sp"))

        os.remove(tempspice)
        os.remove(tempgds)
Пример #10
0
 def LVS(self, final_verification=False):
     """Checks LVS for a module"""
     # Unit tests will check themselves.
     # Do not run if disabled in options.
     if not OPTS.is_unit_test and OPTS.check_lvsdrc:
         tempspice = OPTS.openram_temp + "/temp.sp"
         tempgds = OPTS.openram_temp + "/temp.gds"
         self.sp_write(tempspice)
         self.gds_write(tempgds)
         debug.check(
             verify.run_lvs(self.name, tempgds, tempspice,
                            final_verification) == 0,
             "LVS failed for {0}".format(self.name))
         os.remove(tempspice)
         os.remove(tempgds)
Пример #11
0
    def local_check(self, a):
        tempspice = OPTS.openram_temp + "temp.sp"
        tempgds = OPTS.openram_temp + "temp.gds"

        a.sp_write(tempspice)
        a.gds_write(tempgds)

        self.assertFalse(verify.run_drc(a.name, tempgds))
        self.assertFalse(verify.run_lvs(a.name, tempgds, tempspice))

        os.remove(tempspice)
        os.remove(tempgds)

        # reset the static duplicate name checker for unit tests
        import design
        design.design.name_map=[]
Пример #12
0
    def LVS(self, final_verification=False):
        """Checks LVS for a module"""
        # Unit tests will check themselves.
        # Do not run if disabled in options.

        if (not OPTS.is_unit_test and OPTS.check_lvsdrc and (OPTS.inline_lvsdrc or final_verification)):
            global total_lvs_errors
            tempspice = OPTS.openram_temp + "/temp.sp"
            tempgds = OPTS.openram_temp + "/temp.gds"
            self.sp_write(tempspice)
            self.gds_write(tempgds)
            num_errors = verify.run_lvs(self.name, tempgds, tempspice, final_verification)
            total_lvs_errors += num_errors
            debug.check(num_errors == 0,"LVS failed for {0} with {1} error(s)".format(self.name,num_errors))
            os.remove(tempspice)
            os.remove(tempgds)
Пример #13
0
 def DRC_LVS(self, final_verification=False):
     """Checks both DRC and LVS for a module"""
     if OPTS.check_lvsdrc:
         tempspice = OPTS.openram_temp + "/temp.sp"
         tempgds = OPTS.openram_temp + "/temp.gds"
         self.sp_write(tempspice)
         self.gds_write(tempgds)
         debug.check(
             verify.run_drc(self.name, tempgds) == 0,
             "DRC failed for {0}".format(self.name))
         debug.check(
             verify.run_lvs(self.name, tempgds, tempspice,
                            final_verification) == 0,
             "LVS failed for {0}".format(self.name))
         os.remove(tempspice)
         os.remove(tempgds)
Пример #14
0
    def DRC_LVS(self, final_verification=False, force_check=False):
        """Checks both DRC and LVS for a module"""
        import verify

        # No layout to check
        if OPTS.netlist_only:
            return
        # Unit tests will check themselves.
        elif not force_check and OPTS.is_unit_test:
            return
        elif not force_check and not OPTS.check_lvsdrc:
            return
        # Do not run if disabled in options.
        elif (OPTS.inline_lvsdrc or force_check or final_verification):

            tempspice = "{0}/{1}.sp".format(OPTS.openram_temp, self.name)
            tempgds = "{0}/{1}.gds".format(OPTS.openram_temp, self.name)
            self.lvs_write(tempspice)
            self.gds_write(tempgds)
            # Final verification option does not allow nets to be connected by label.
            self.drc_errors = verify.run_drc(
                self.name,
                tempgds,
                extract=True,
                final_verification=final_verification)
            self.lvs_errors = verify.run_lvs(
                self.name,
                tempgds,
                tempspice,
                final_verification=final_verification)

            # force_check is used to determine decoder height and other things, so we shouldn't fail
            # if that flag is set
            if OPTS.inline_lvsdrc and not force_check:
                debug.check(
                    self.drc_errors == 0,
                    "DRC failed for {0} with {1} error(s)".format(
                        self.name, self.drc_errors))
                debug.check(
                    self.lvs_errors == 0,
                    "LVS failed for {0} with {1} errors(s)".format(
                        self.name, self.lvs_errors))

            if OPTS.purge_temp:
                os.remove(tempspice)
                os.remove(tempgds)
Пример #15
0
    def local_check(self, a, final_verification=False):

        self.reset()

        tempspice = OPTS.openram_temp + "temp.sp"
        tempgds = OPTS.openram_temp + "temp.gds"

        a.sp_write(tempspice)
        a.gds_write(tempgds)

        import verify
        result = verify.run_drc(a.name, tempgds)
        if result != 0:
            self.fail("DRC failed: {}".format(a.name))

        result = verify.run_lvs(a.name, tempgds, tempspice, final_verification)
        if result != 0:
            self.fail("LVS mismatch: {}".format(a.name))

        if OPTS.purge_temp:
            self.cleanup()
    def func_test(self, bank_num):

        import sram
        import tech

        debug.info(1,
                   "Testing timing for sample 1bit, 16words SRAM with 1 bank")
        OPTS.check_lvsdrc = False
        OPTS.use_pex = True
        s = sram.sram(word_size=OPTS.word_size,
                      num_words=OPTS.num_words,
                      num_banks=OPTS.num_banks,
                      name="test_sram1")
        OPTS.check_lvsdrc = True
        OPTS.use_pex = False

        tempspice = OPTS.openram_temp + "temp.sp"
        tempgds = OPTS.openram_temp + "temp.gds"

        s.sp_write(tempspice)
        s.gds_write(tempgds)

        self.assertFalse(verify.run_drc(s.name, tempgds))
        self.assertFalse(verify.run_lvs(s.name, tempgds, tempspice))
        self.assertFalse(
            verify.run_pex(s.name,
                           tempgds,
                           tempspice,
                           output=OPTS.openram_temp + "temp_pex.sp"))

        import sp_file
        stimulus_file = OPTS.openram_temp + "stimulus.sp"
        a_stimulus = sp_file.sp_file(stimulus_file)
        self.write_stimulus(a_stimulus)

        simulator_file = OPTS.openram_temp + "simulator.sp"
        a_simulator = sp_file.sp_file(simulator_file)
        self.write_simulator(a_simulator)

        result_file = OPTS.openram_temp + "result"

        import os

        if OPTS.spice_name == "hspice":
            cmd = "hspice -mt 2 -i {0} > {1} ".format(simulator_file,
                                                      result_file)
        else:
            cmd = "ngspice -b  -i {0} > {1}  ".format(simulator_file,
                                                      result_file)
        os.system(cmd)

        import re
        sp_result = open(result_file, "r")
        contents = sp_result.read()
        key = "vr1"
        val = re.search(r"{0}(\s*)=(\s*)(\d*(.).*)(\s*)(from)".format(key),
                        contents)
        val = val.group(3)
        value1 = float(self.convert_voltage_unit(val))

        key = "vr2"
        val = re.search(r"{0}(\s*)=(\s*)(\d*(.).*)(\s*)(from)".format(key),
                        contents)
        val = val.group(3)
        value2 = float(self.convert_voltage_unit(val))

        self.assertTrue(round(value1) > 0.5 * tech.spice["supply_voltage"])
        self.assertTrue(round(value2) < 0.5 * tech.spice["supply_voltage"])

        OPTS.check_lvsdrc = True