From d9dbd7a4b64ce6999be56bfe2d105c5e382135f0 Mon Sep 17 00:00:00 2001 From: zjxzjxzjx Date: Sun, 30 Aug 2020 21:24:55 +0800 Subject: [PATCH] fix yosys bugs --- designcfg.py | 2 +- engine.py | 18 ++++++++++++------ flow.py | 17 ++++++++++------- ops/cds/syn.py | 2 +- ops/opensource/syn/yosys.py | 11 ++++++----- util.py | 26 +++++++++++++------------- 6 files changed, 43 insertions(+), 33 deletions(-) diff --git a/designcfg.py b/designcfg.py index 3530141..a9b9b9e 100644 --- a/designcfg.py +++ b/designcfg.py @@ -3,7 +3,7 @@ class Design(object): def __init__(self, top_name): self.top_name = top_name self.lib_name = "gscl45nm" - self.rtl_file = "{gcd.v}" + self.rtl_file = "gcd.v" #self.hdl_path = "./design/gcd/hdl" #self.lib_path = "./design/lib" self.mmmc_file = "flow.view" diff --git a/engine.py b/engine.py index 447ca84..56f3e61 100644 --- a/engine.py +++ b/engine.py @@ -8,7 +8,7 @@ import ops.cds.place as place1 import ops.cds.cts as cts1 import ops.cds.route as route1 import ops.cds.drc as drc1 -import ops.openroad.syn as syn2 +import ops.opensource.syn.yosys as syn2 def run(design, flow): design_name = design.top_name @@ -24,7 +24,13 @@ def run(design, flow): tmp_op_syn.config(design, design_name + "_" + x[1]) make_file.write("all:\n") make_file.write("\tgenus -legacy_ui -batch -files " + script_path + design_name + "_" + x[1] + ".tcl\n") - #if x[0] == "OpenROADSynth": + + if x[0] == "YosysSynth": + script_path = "../scripts/" + tmp_op_syn = eval("syn2." + "YosysSynth" + "(design)") + tmp_op_syn.config(design, design_name + "_" + x[1]) + make_file.write("all:\n") + make_file.write("\tyosys " + script_path + design_name + "_" + x[1] + ".ys\n") if x[0] == "InnovusFloorplan": tmp_op_fp = eval("fp1." + "InnovusFloorplan" + "(design)") @@ -59,8 +65,8 @@ def run(design, flow): overall_tcl.write('source %s/%s_to_drc.tcl\n'%(tcl_path, design_name)) - make_file.write("\tinnovus -batch -files " + script_path + "flow.tcl") - run_path = util.getRunPath(design, "Cadence") + #make_file.write("\tinnovus -batch -files " + script_path + "flow.tcl") + run_path = util.getRunPath(design, "Yosys") os.chdir(run_path) print(os.getcwd()) #cmd_clean = 'rm innovus.* genus.*' @@ -68,8 +74,8 @@ def run(design, flow): #cmd_clean = 'rm -rf fv' #subprocess.Popen(cmd_clean, shell=True).wait() cmd = 'make' - subprocess.Popen(cmd) - #subprocess.Popen(cmd, shell=True).wait() + #subprocess.Popen(cmd) + subprocess.Popen(cmd, shell=True).wait() return 0 diff --git a/flow.py b/flow.py index 8bc4c49..55bfaeb 100644 --- a/flow.py +++ b/flow.py @@ -16,25 +16,28 @@ class MyFlow(object): self.params_drc = [] def flow(self): - op_synth = "GenusSynth" - self.ops.append((op_synth, "to_synth")) + #op_synth = "GenusSynth" + #self.ops.append((op_synth, "to_synth")) + + op_synth = "YosysSynth" + self.ops.append((op_synth, "to_synth")) op_floorplan = "InnovusFloorplan" - self.ops.append((op_floorplan, "to_floorplan")) + #self.ops.append((op_floorplan, "to_floorplan")) - self.params_fp.append(("r","1.0 0.7 0.0 0.0 0.0 0.0")) + #self.params_fp.append(("r","1.0 0.7 0.0 0.0 0.0 0.0")) op_pdn = "InnovusPDN" - self.ops.append((op_pdn, "to_pdn")) + #self.ops.append((op_pdn, "to_pdn")) op_place = "InnovusPlace" - self.ops.append((op_place, "to_place")) + #self.ops.append((op_place, "to_place")) op_cts = "InnovusCTS" #self.ops.append((op_cts, "to_cts")) op_route = "InnovusRoute" - self.ops.append((op_route, "to_route")) + #self.ops.append((op_route, "to_route")) op_drc = "InnovusDRC" #self.ops.append((op_drc, "to_drc")) diff --git a/ops/cds/syn.py b/ops/cds/syn.py index 5526671..e3855d1 100644 --- a/ops/cds/syn.py +++ b/ops/cds/syn.py @@ -69,7 +69,7 @@ class GenusSynth(): tcl = open(tcl_path + "/" + tcl_file + ".tcl", 'w', encoding='utf-8') #tcl.write('set hdl_files %s\n'%(self.design.rtl_file)) - tcl.write('set hdl_files %s\n'%(rtl_file)) + tcl.write('set hdl_files {%s}\n'%(rtl_file)) tcl.write('set DESIGN %s\n'%(self.design.top_name)) tcl.write('set clkpin %s\n'%(self.design.clk_name)) tcl.write('set delay %d\n'%(self.design.delay)) diff --git a/ops/opensource/syn/yosys.py b/ops/opensource/syn/yosys.py index 5a3e7a3..9b20690 100644 --- a/ops/opensource/syn/yosys.py +++ b/ops/opensource/syn/yosys.py @@ -5,6 +5,7 @@ import util class YosysSynth(): def __init__(self, design): self.params = dict() + self.design = design def getObjHDL(self): obj_path = util.getObjPath(self.design, "Yosys") @@ -40,16 +41,16 @@ class YosysSynth(): def config(self, design, tcl_file): rtl_file = util.getHDL(self.design) lib_file = util.getLib(self.design) - top_name = util.getTop(self.design) + #top_name = self.design.top_name hdl_path = util.getHDLPath(self.design, "Yosys") lib_path = util.getLibPath(self.design, "Yosys") tcl_path = util.getScriptPath(self.design, "Yosys") tcl = open(tcl_path + "/" + tcl_file + ".ys", 'w', encoding = 'utf-8') - tcl.write('read -sv %s\n'%(rtl_file) - tcl.write('hierarchy -top %s\n'%(top_name)) - tcl.write('proc; opt; techmap; opt') - tcl.write('write_verilog %s\n'*(self.getObjHDL())) + tcl.write('read -sv %s\n'%(hdl_path + "/" + rtl_file)) + tcl.write('hierarchy -top %s\n'%(self.design.top_name)) + tcl.write('proc; opt; techmap; opt\n') + tcl.write('write_verilog %s\n'%(self.getObjHDL())) tcl.close() diff --git a/util.py b/util.py index 3c1f28b..5c14666 100644 --- a/util.py +++ b/util.py @@ -19,48 +19,48 @@ def getMmmc(design): def getHDLPath(design, baseflow): if baseflow == "Cadence": hdl_path = home_path + "/design/" + design.top_name + "/hdl" - elif baseflow == "Openroad": - hdl_path = "/OpenROAD-flow/flow/designs/design/" + design.top_name + "/hdl" + elif baseflow == "Yosys": + hdl_path = home_path + "/design/" + design.top_name + "/hdl" return hdl_path def getLibPath(design, baseflow): if baseflow == "Cadence": lib_path = home_path + "/design/lib" - elif baseflow == "Openroad": - lib_path = "/OpenROAD-flow/flow/platforms/" + design.lib_name + elif baseflow == "Yosys": + lib_path = home_path + "/design/lib" return lib_path def getLefPath(design, baseflow): if baseflow == "Cadence": lef_path = home_path + "/design/lib" - elif baseflow == "Openroad": + elif baseflow == "Yosys": lef_path = "" return lef_path def getRptPath(design, baseflow): if baseflow == "Cadence": rpt_path = home_path + "/design/" + design.top_name + "/" + design.lib_name + "/reports" - elif baseflow == "Openroad": - rpt_path = "/OpenROAD-flow/flow" + design.top_name + "/" + design.lib_name + "/reports" + elif baseflow == "Yosys": + rpt_path = home_path + "/design/" + design.top_name + "/" + design.lib_name + "/reports" return rpt_path def getObjPath(design, baseflow): if baseflow == "Cadence": obj_path = home_path + "/design/" + design.top_name + "/" + design.lib_name + "/objects" - elif baseflow == "Openroad": - obj_path = "/OpenROAD-flow/flow" + design.top_name + "/" + design.lib_name + "/objects" + elif baseflow == "Yosys": + obj_path = home_path + "/design/" + design.top_name + "/" + design.lib_name + "/objects" return obj_path def getScriptPath(design, baseflow): if baseflow == "Cadence": script_path = home_path + "/design/" + design.top_name + "/" + design.lib_name + "/scripts" - elif baseflow == "Openroad": - script_path = "/OpenROAD-flow/flow" + design.top_name + "/" + design.lib_name + "/scripts" + elif baseflow == "Yosys": + script_path = home_path + "/design/" + design.top_name + "/" + design.lib_name + "/scripts" return script_path def getRunPath(design, baseflow): if baseflow == "Cadence": run_path = home_path + "/design/" + design.top_name + "/" + design.lib_name + "/run" - elif baseflow == "Openroad": - run_path = "/OpenROAD-flow/flow" + design.top_name + "/" + design.lib_name + "/run" + elif baseflow == "Yosys": + run_path = home_path + "/design/" + design.top_name + "/" + design.lib_name + "/run" return run_path \ No newline at end of file