mirror of https://github.com/VLSIDA/OpenRAM.git
Move verify into a module. Make characterizer a module. Move exe searching to modules.
This commit is contained in:
parent
658f794b12
commit
2eb9f5c6bc
|
|
@ -0,0 +1,31 @@
|
||||||
|
import os
|
||||||
|
import debug
|
||||||
|
from globals import OPTS,find_exe,get_tool
|
||||||
|
import lib
|
||||||
|
import delay
|
||||||
|
import setup_hold
|
||||||
|
|
||||||
|
|
||||||
|
debug.info(2,"Initializing characterizer...")
|
||||||
|
|
||||||
|
spice_exe = ""
|
||||||
|
|
||||||
|
if OPTS.analytical_delay:
|
||||||
|
debug.info(1,"Using analytical delay models (no characterization)")
|
||||||
|
else:
|
||||||
|
if OPTS.spice_version != "":
|
||||||
|
spice_exe=find_exe(OPTS.spice_version)
|
||||||
|
if spice_exe=="":
|
||||||
|
debug.error("{0} not found. Unable to perform characterization.".format(OPTS.spice_version),1)
|
||||||
|
else:
|
||||||
|
(choice,spice_exe) = get_tool("spice",["xa", "hspice", "ngspice", "ngspice.exe"])
|
||||||
|
OPTS.spice_version = choice
|
||||||
|
|
||||||
|
# set the input dir for spice files if using ngspice
|
||||||
|
if OPTS.spice_version == "ngspice":
|
||||||
|
os.environ["NGSPICE_INPUT_DIR"] = "{0}".format(OPTS.openram_temp)
|
||||||
|
|
||||||
|
if spice_exe == "":
|
||||||
|
debug.error("No recognizable spice version found. Unable to perform characterization.",1)
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -278,21 +278,22 @@ def run_sim():
|
||||||
temp_stim = "{0}stim.sp".format(OPTS.openram_temp)
|
temp_stim = "{0}stim.sp".format(OPTS.openram_temp)
|
||||||
|
|
||||||
|
|
||||||
|
from characterizer import spice_exe
|
||||||
if OPTS.spice_version == "xa":
|
if OPTS.spice_version == "xa":
|
||||||
cmd = "{0} {1} -o {2}xa -mt 20".format(OPTS.spice_exe,
|
cmd = "{0} {1} -o {2}xa -mt 20".format(spice_exe,
|
||||||
temp_stim,
|
temp_stim,
|
||||||
OPTS.openram_temp)
|
OPTS.openram_temp)
|
||||||
valid_retcode=0
|
valid_retcode=0
|
||||||
elif OPTS.spice_version == "hspice":
|
elif OPTS.spice_version == "hspice":
|
||||||
# TODO: Should make multithreading parameter a configuration option
|
# TODO: Should make multithreading parameter a configuration option
|
||||||
cmd = "{0} -mt 2 -i {1} -o {2}timing".format(OPTS.spice_exe,
|
cmd = "{0} -mt 2 -i {1} -o {2}timing".format(spice_exe,
|
||||||
temp_stim,
|
temp_stim,
|
||||||
OPTS.openram_temp)
|
OPTS.openram_temp)
|
||||||
valid_retcode=0
|
valid_retcode=0
|
||||||
else:
|
else:
|
||||||
cmd = "{0} -b -o {2}timing.lis {1}".format(OPTS.spice_exe,
|
cmd = "{0} -b -o {2}timing.lis {1}".format(spice_exe,
|
||||||
temp_stim,
|
temp_stim,
|
||||||
OPTS.openram_temp)
|
OPTS.openram_temp)
|
||||||
# for some reason, ngspice-25 returns 1 when it only has acceptable warnings
|
# for some reason, ngspice-25 returns 1 when it only has acceptable warnings
|
||||||
valid_retcode=1
|
valid_retcode=1
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -25,9 +25,6 @@ minor_python_version = sys.version_info.minor
|
||||||
if not (major_python_version == 2 and minor_python_version >= 7):
|
if not (major_python_version == 2 and minor_python_version >= 7):
|
||||||
debug.error("Python 2.7 is required.",-1)
|
debug.error("Python 2.7 is required.",-1)
|
||||||
|
|
||||||
def is_exe(fpath):
|
|
||||||
return os.path.exists(fpath) and os.access(fpath, os.X_OK)
|
|
||||||
|
|
||||||
# parse the optional arguments
|
# parse the optional arguments
|
||||||
# this only does the optional arguments
|
# this only does the optional arguments
|
||||||
|
|
||||||
|
|
@ -113,15 +110,23 @@ def init_openram(config_file):
|
||||||
|
|
||||||
import_tech()
|
import_tech()
|
||||||
|
|
||||||
set_spice()
|
def get_tool(tool_type, preferences):
|
||||||
|
"""
|
||||||
|
Find which tool we have from a list of preferences and return the full path.
|
||||||
|
"""
|
||||||
|
debug.info(2,"Finding {} tool...".format(tool_type))
|
||||||
global OPTS
|
global OPTS
|
||||||
OPTS.drc_exe = get_tool("DRC",["calibre","assura","magic"])
|
|
||||||
OPTS.lvs_exe = get_tool("LVS",["calibre","assura","netgen"])
|
for name in preferences:
|
||||||
OPTS.pex_exe = get_tool("PEX",["calibre","magic"])
|
exe_name = find_exe(name)
|
||||||
#set_drc()
|
if exe_name!="":
|
||||||
#set_lvs()
|
debug.info(1, "Using {0}: {1}".format(tool_type,exe_name))
|
||||||
#set_pex()
|
return(name,exe_name)
|
||||||
|
else:
|
||||||
|
debug.info(1, "Could not find {0}, trying next {1} tool.".format(name,tool_type))
|
||||||
|
else:
|
||||||
|
return(None,"")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def read_config(config_file):
|
def read_config(config_file):
|
||||||
|
|
@ -160,36 +165,6 @@ def read_config(config_file):
|
||||||
debug.error("Unable to make output directory.",-1)
|
debug.error("Unable to make output directory.",-1)
|
||||||
|
|
||||||
|
|
||||||
def find_exe(check_exe):
|
|
||||||
""" Check if the binary exists in the path and return the full path. """
|
|
||||||
# Check if the preferred spice option exists in the path
|
|
||||||
for path in os.environ["PATH"].split(os.pathsep):
|
|
||||||
exe = os.path.join(path, check_exe)
|
|
||||||
# if it is found, then break and use first version
|
|
||||||
if is_exe(exe):
|
|
||||||
return exe
|
|
||||||
return ""
|
|
||||||
|
|
||||||
def get_tool(tool_type, preferences):
|
|
||||||
"""
|
|
||||||
Find which tool we have from a list of preferences and return the full path.
|
|
||||||
"""
|
|
||||||
debug.info(2,"Finding {} tool...".format(tool_type))
|
|
||||||
global OPTS
|
|
||||||
|
|
||||||
if not OPTS.check_lvsdrc:
|
|
||||||
debug.info(1,"LVS/DRC/PEX disabled.")
|
|
||||||
return None
|
|
||||||
else:
|
|
||||||
for name in preferences:
|
|
||||||
exe_name = find_exe(name)
|
|
||||||
if exe_name!="":
|
|
||||||
debug.info(1, "Using {0}: {1}".format(tool_type,exe_name))
|
|
||||||
return(exe_name)
|
|
||||||
else:
|
|
||||||
debug.info(1, "Could not find {0}, trying next {1} tool.".format(name,tool_type))
|
|
||||||
else:
|
|
||||||
return("")
|
|
||||||
|
|
||||||
def end_openram():
|
def end_openram():
|
||||||
""" Clean up openram for a proper exit """
|
""" Clean up openram for a proper exit """
|
||||||
|
|
@ -245,31 +220,18 @@ def setup_paths():
|
||||||
os.chmod(OPTS.openram_temp, 0o750)
|
os.chmod(OPTS.openram_temp, 0o750)
|
||||||
|
|
||||||
|
|
||||||
|
def is_exe(fpath):
|
||||||
|
return os.path.exists(fpath) and os.access(fpath, os.X_OK)
|
||||||
def set_spice():
|
|
||||||
debug.info(2,"Finding spice...")
|
|
||||||
global OPTS
|
|
||||||
|
|
||||||
if OPTS.analytical_delay:
|
|
||||||
debug.info(1,"Using analytical delay models (no characterization)")
|
|
||||||
return
|
|
||||||
else:
|
|
||||||
if OPTS.spice_version != "":
|
|
||||||
OPTS.spice_exe=find_exe(OPTS.spice_version)
|
|
||||||
if OPTS.spice_exe=="":
|
|
||||||
debug.error("{0} not found. Unable to perform characterization.".format(OPTS.spice_version),1)
|
|
||||||
else:
|
|
||||||
OPTS.spice_exe = get_tool("spice",["xa", "hspice", "ngspice", "ngspice.exe"])
|
|
||||||
|
|
||||||
# set the input dir for spice files if using ngspice
|
|
||||||
if OPTS.spice_version == "ngspice":
|
|
||||||
os.environ["NGSPICE_INPUT_DIR"] = "{0}".format(OPTS.openram_temp)
|
|
||||||
|
|
||||||
if OPTS.spice_exe == "":
|
|
||||||
debug.error("No recognizable spice version found. Unable to perform characterization.",1)
|
|
||||||
|
|
||||||
|
|
||||||
|
def find_exe(check_exe):
|
||||||
|
""" Check if the binary exists in the path and return the full path. """
|
||||||
|
# Check if the preferred spice option exists in the path
|
||||||
|
for path in os.environ["PATH"].split(os.pathsep):
|
||||||
|
exe = os.path.join(path, check_exe)
|
||||||
|
# if it is found, then break and use first version
|
||||||
|
if is_exe(exe):
|
||||||
|
return exe
|
||||||
|
return ""
|
||||||
|
|
||||||
# imports correct technology directories for testing
|
# imports correct technology directories for testing
|
||||||
def import_tech():
|
def import_tech():
|
||||||
|
|
|
||||||
|
|
@ -107,7 +107,7 @@ if OPTS.use_pex:
|
||||||
verify.run_pex(s.name, gdsname, spname, output=sram_file)
|
verify.run_pex(s.name, gdsname, spname, output=sram_file)
|
||||||
|
|
||||||
# Characterize the design
|
# Characterize the design
|
||||||
import lib
|
from characterizer import lib
|
||||||
libname = OPTS.output_path + s.name + ".lib"
|
libname = OPTS.output_path + s.name + ".lib"
|
||||||
print("LIB: Writing to {0}".format(libname))
|
print("LIB: Writing to {0}".format(libname))
|
||||||
lib.lib(libname,s,sram_file)
|
lib.lib(libname,s,sram_file)
|
||||||
|
|
|
||||||
|
|
@ -24,8 +24,11 @@ class timing_sram_test(unittest.TestCase):
|
||||||
OPTS.check_lvsdrc = False
|
OPTS.check_lvsdrc = False
|
||||||
OPTS.spice_version="hspice"
|
OPTS.spice_version="hspice"
|
||||||
OPTS.analytical_delay = False
|
OPTS.analytical_delay = False
|
||||||
globals.set_spice()
|
# This is a hack to reload the characterizer __init__ with the spice version
|
||||||
|
import characterizer
|
||||||
|
reload(characterizer)
|
||||||
|
from characterizer import delay
|
||||||
|
|
||||||
import sram
|
import sram
|
||||||
|
|
||||||
debug.info(1, "Testing timing for sample 1bit, 16words SRAM with 1 bank")
|
debug.info(1, "Testing timing for sample 1bit, 16words SRAM with 1 bank")
|
||||||
|
|
@ -36,8 +39,6 @@ class timing_sram_test(unittest.TestCase):
|
||||||
|
|
||||||
OPTS.check_lvsdrc = True
|
OPTS.check_lvsdrc = True
|
||||||
|
|
||||||
import delay
|
|
||||||
|
|
||||||
tempspice = OPTS.openram_temp + "temp.sp"
|
tempspice = OPTS.openram_temp + "temp.sp"
|
||||||
s.sp_write(tempspice)
|
s.sp_write(tempspice)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -23,8 +23,7 @@ class timing_setup_test(unittest.TestCase):
|
||||||
|
|
||||||
# we will manually run lvs/drc
|
# we will manually run lvs/drc
|
||||||
OPTS.check_lvsdrc = False
|
OPTS.check_lvsdrc = False
|
||||||
OPTS.spice_version="hspice"
|
from characterizer import delay
|
||||||
globals.set_spice()
|
|
||||||
|
|
||||||
import sram
|
import sram
|
||||||
import tech
|
import tech
|
||||||
|
|
|
||||||
|
|
@ -22,8 +22,11 @@ class timing_sram_test(unittest.TestCase):
|
||||||
OPTS.check_lvsdrc = False
|
OPTS.check_lvsdrc = False
|
||||||
OPTS.spice_version="ngspice"
|
OPTS.spice_version="ngspice"
|
||||||
OPTS.analytical_delay = False
|
OPTS.analytical_delay = False
|
||||||
globals.set_spice()
|
# This is a hack to reload the characterizer __init__ with the spice version
|
||||||
|
import characterizer
|
||||||
|
reload(characterizer)
|
||||||
|
from characterizer import delay
|
||||||
|
|
||||||
import sram
|
import sram
|
||||||
|
|
||||||
debug.info(1, "Testing timing for sample 1bit, 16words SRAM with 1 bank")
|
debug.info(1, "Testing timing for sample 1bit, 16words SRAM with 1 bank")
|
||||||
|
|
@ -32,8 +35,6 @@ class timing_sram_test(unittest.TestCase):
|
||||||
num_banks=OPTS.config.num_banks,
|
num_banks=OPTS.config.num_banks,
|
||||||
name="sram1")
|
name="sram1")
|
||||||
|
|
||||||
import delay
|
|
||||||
|
|
||||||
tempspice = OPTS.openram_temp + "temp.sp"
|
tempspice = OPTS.openram_temp + "temp.sp"
|
||||||
s.sp_write(tempspice)
|
s.sp_write(tempspice)
|
||||||
|
|
||||||
|
|
@ -84,7 +85,7 @@ class timing_sram_test(unittest.TestCase):
|
||||||
OPTS.check_lvsdrc = True
|
OPTS.check_lvsdrc = True
|
||||||
OPTS.spice_version="hspice"
|
OPTS.spice_version="hspice"
|
||||||
OPTS.analytical_delay = True
|
OPTS.analytical_delay = True
|
||||||
globals.set_spice()
|
reload(characterizer)
|
||||||
|
|
||||||
os.remove(tempspice)
|
os.remove(tempspice)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -23,14 +23,15 @@ class timing_setup_test(unittest.TestCase):
|
||||||
# we will manually run lvs/drc
|
# we will manually run lvs/drc
|
||||||
OPTS.check_lvsdrc = False
|
OPTS.check_lvsdrc = False
|
||||||
OPTS.spice_version="ngspice"
|
OPTS.spice_version="ngspice"
|
||||||
globals.set_spice()
|
# This is a hack to reload the characterizer __init__ with the spice version
|
||||||
|
import characterizer
|
||||||
|
reload(characterizer)
|
||||||
|
from characterizer import setup_hold
|
||||||
|
|
||||||
import sram
|
import sram
|
||||||
import tech
|
import tech
|
||||||
slews = [tech.spice["rise_time"]*2]
|
slews = [tech.spice["rise_time"]*2]
|
||||||
|
|
||||||
import setup_hold
|
|
||||||
|
|
||||||
sh = setup_hold.setup_hold()
|
sh = setup_hold.setup_hold()
|
||||||
data = sh.analyze(slews,slews)
|
data = sh.analyze(slews,slews)
|
||||||
|
|
||||||
|
|
@ -60,7 +61,9 @@ class timing_setup_test(unittest.TestCase):
|
||||||
# reset these options
|
# reset these options
|
||||||
OPTS.check_lvsdrc = True
|
OPTS.check_lvsdrc = True
|
||||||
OPTS.spice_version="hspice"
|
OPTS.spice_version="hspice"
|
||||||
globals.set_spice()
|
|
||||||
|
reload(characterizer)
|
||||||
|
|
||||||
globals.end_openram()
|
globals.end_openram()
|
||||||
|
|
||||||
# instantiate a copdsay of the class to actually run the test
|
# instantiate a copdsay of the class to actually run the test
|
||||||
|
|
|
||||||
|
|
@ -8,38 +8,52 @@ run_pex, repsectively. If there is an error, they should abort and report the er
|
||||||
If not, OpenRAM will continue as if nothing happened!
|
If not, OpenRAM will continue as if nothing happened!
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
import debug
|
import debug
|
||||||
from globals import OPTS
|
from globals import OPTS,find_exe,get_tool
|
||||||
|
|
||||||
|
|
||||||
if OPTS.drc_exe == None:
|
debug.info(2,"Initializing verify...")
|
||||||
|
|
||||||
|
if not OPTS.check_lvsdrc:
|
||||||
|
debug.info(1,"LVS/DRC/PEX disabled.")
|
||||||
|
drc_exe = None
|
||||||
|
lvs_exe = None
|
||||||
|
pex_exe = None
|
||||||
|
else:
|
||||||
|
drc_exe = get_tool("DRC",["calibre","assura","magic"])
|
||||||
|
lvs_exe = get_tool("LVS",["calibre","assura","netgen"])
|
||||||
|
pex_exe = get_tool("PEX",["calibre","magic"])
|
||||||
|
|
||||||
|
|
||||||
|
if drc_exe == None:
|
||||||
pass
|
pass
|
||||||
elif "calibre" in OPTS.drc_exe:
|
elif "calibre" in drc_exe:
|
||||||
from calibre import run_drc
|
from calibre import run_drc
|
||||||
elif "assura" in OPTS.drc_exe:
|
elif "assura" in drc_exe:
|
||||||
from assura import run_drc
|
from assura import run_drc
|
||||||
elif "magic" in OPTS.drc_exe:
|
elif "magic" in drc_exe:
|
||||||
from magic import run_drc
|
from magic import run_drc
|
||||||
else:
|
else:
|
||||||
debug.warning("Did not find a supported DRC tool.")
|
debug.warning("Did not find a supported DRC tool.")
|
||||||
|
|
||||||
if OPTS.lvs_exe == None:
|
if lvs_exe == None:
|
||||||
pass
|
pass
|
||||||
elif "calibre" in OPTS.lvs_exe:
|
elif "calibre" in lvs_exe:
|
||||||
from calibre import run_lvs
|
from calibre import run_lvs
|
||||||
elif "assura" in OPTS.lvs_exe:
|
elif "assura" in lvs_exe:
|
||||||
from assura import run_lvs
|
from assura import run_lvs
|
||||||
elif "netgen" in OPTS.lvs_exe:
|
elif "netgen" in lvs_exe:
|
||||||
from magic import run_lvs
|
from magic import run_lvs
|
||||||
else:
|
else:
|
||||||
debug.warning("Did not find a supported LVS tool.")
|
debug.warning("Did not find a supported LVS tool.")
|
||||||
|
|
||||||
|
|
||||||
if OPTS.pex_exe == None:
|
if pex_exe == None:
|
||||||
pass
|
pass
|
||||||
elif "calibre" in OPTS.pex_exe:
|
elif "calibre" in pex_exe:
|
||||||
from calibre import run_pex
|
from calibre import run_pex
|
||||||
elif "magic" in OPTS.pex_exe:
|
elif "magic" in pex_exe:
|
||||||
from magic import run_pex
|
from magic import run_pex
|
||||||
else:
|
else:
|
||||||
debug.warning("Did not find a supported PEX tool.")
|
debug.warning("Did not find a supported PEX tool.")
|
||||||
|
|
@ -100,10 +100,9 @@ def run_drc(name, gds_name):
|
||||||
errfile = "{0}{1}.drc.err".format(OPTS.openram_temp, name)
|
errfile = "{0}{1}.drc.err".format(OPTS.openram_temp, name)
|
||||||
outfile = "{0}{1}.drc.out".format(OPTS.openram_temp, name)
|
outfile = "{0}{1}.drc.out".format(OPTS.openram_temp, name)
|
||||||
|
|
||||||
cmd = "{0} -gui -drc {1}drc_runset -batch 2> {2} 1> {3}".format(OPTS.drc_exe,
|
cmd = "calibre -gui -drc {0}drc_runset -batch 2> {1} 1> {2}".format(OPTS.openram_temp,
|
||||||
OPTS.openram_temp,
|
errfile,
|
||||||
errfile,
|
outfile)
|
||||||
outfile)
|
|
||||||
debug.info(1, cmd)
|
debug.info(1, cmd)
|
||||||
os.system(cmd)
|
os.system(cmd)
|
||||||
os.chdir(cwd)
|
os.chdir(cwd)
|
||||||
|
|
@ -177,10 +176,9 @@ def run_lvs(name, gds_name, sp_name):
|
||||||
errfile = "{0}{1}.lvs.err".format(OPTS.openram_temp, name)
|
errfile = "{0}{1}.lvs.err".format(OPTS.openram_temp, name)
|
||||||
outfile = "{0}{1}.lvs.out".format(OPTS.openram_temp, name)
|
outfile = "{0}{1}.lvs.out".format(OPTS.openram_temp, name)
|
||||||
|
|
||||||
cmd = "{0} -gui -lvs {1}lvs_runset -batch 2> {2} 1> {3}".format(OPTS.lvs_exe,
|
cmd = "calibre -gui -lvs {0}lvs_runset -batch 2> {1} 1> {2}".format(OPTS.openram_temp,
|
||||||
OPTS.openram_temp,
|
errfile,
|
||||||
errfile,
|
outfile)
|
||||||
outfile)
|
|
||||||
debug.info(1, cmd)
|
debug.info(1, cmd)
|
||||||
os.system(cmd)
|
os.system(cmd)
|
||||||
os.chdir(cwd)
|
os.chdir(cwd)
|
||||||
|
|
@ -287,10 +285,9 @@ def run_pex(name, gds_name, sp_name, output=None):
|
||||||
errfile = "{0}{1}.pex.err".format(OPTS.openram_temp, name)
|
errfile = "{0}{1}.pex.err".format(OPTS.openram_temp, name)
|
||||||
outfile = "{0}{1}.pex.out".format(OPTS.openram_temp, name)
|
outfile = "{0}{1}.pex.out".format(OPTS.openram_temp, name)
|
||||||
|
|
||||||
cmd = "{0} -gui -pex {1}pex_runset -batch 2> {2} 1> {3}".format(OPTS.pex_exe,
|
cmd = "calibre -gui -pex {0}pex_runset -batch 2> {1} 1> {2}".format(OPTS.openram_temp,
|
||||||
OPTS.openram_temp,
|
errfile,
|
||||||
errfile,
|
outfile)
|
||||||
outfile)
|
|
||||||
debug.info(2, cmd)
|
debug.info(2, cmd)
|
||||||
os.system(cmd)
|
os.system(cmd)
|
||||||
os.chdir(cwd)
|
os.chdir(cwd)
|
||||||
Loading…
Reference in New Issue