Skip to content

Commit 5646fb6

Browse files
committed
sdc_expand, opensta: start
1 parent 0646c05 commit 5646fb6

File tree

3 files changed

+271
-0
lines changed

3 files changed

+271
-0
lines changed

techlibs/common/Makefile.inc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
ifneq ($(SMALL),1)
33
OBJS += techlibs/common/synth.o
44
OBJS += techlibs/common/prep.o
5+
OBJS += techlibs/common/opensta.o
6+
OBJS += techlibs/common/sdc_expand.o
57
endif
68

79
GENFILES += techlibs/common/simlib_help.inc

techlibs/common/opensta.cc

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
// #include "kernel/register.h"
2+
// #include "kernel/celltypes.h"
3+
#include "kernel/rtlil.h"
4+
#include "kernel/log.h"
5+
6+
USING_YOSYS_NAMESPACE
7+
PRIVATE_NAMESPACE_BEGIN
8+
9+
struct OpenstaPass : public Pass
10+
{
11+
const char* default_sta_cmd = "sta";
12+
OpenstaPass() : Pass("opensta", "run OpenSTA") { }
13+
14+
void help() override
15+
{
16+
// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
17+
log("\n");
18+
log(" opensta [options]\n");
19+
log("\n");
20+
// TOOD
21+
log("\n");
22+
log(" -exe <command>\n");
23+
log(" use <command> to run OpenSTA instead of \"%s\"\n", default_sta_cmd);
24+
log("\n");
25+
log(" -sdc-in <filename>\n");
26+
log(" expand SDC input file <filename>\n");
27+
log("\n");
28+
log(" -sdc-out <filename>\n");
29+
log(" expand SDC file to output file <filename>\n");
30+
log("\n");
31+
log(" -nocleanup\n");
32+
log("\n");
33+
log("\n");
34+
}
35+
36+
void execute(std::vector<std::string> args, RTLIL::Design *design) override
37+
{
38+
string run_from, run_to;
39+
string opensta_exe;
40+
string sdc_filename, sdc_expanded_filename;
41+
string tempdir_name, script_filename;
42+
string verilog_filename, liberty_filename;
43+
bool cleanup = true;
44+
45+
log_header(design, "Executing OPENSTA pass.\n");
46+
log_push();
47+
48+
size_t argidx;
49+
for (argidx = 1; argidx < args.size(); argidx++)
50+
{
51+
if (args[argidx] == "-exe" && argidx+1 < args.size()) {
52+
opensta_exe = args[++argidx];
53+
continue;
54+
}
55+
if (args[argidx] == "-sdc-in" && argidx+1 < args.size()) {
56+
sdc_filename = args[++argidx];
57+
continue;
58+
}
59+
if (args[argidx] == "-sdc-out" && argidx+1 < args.size()) {
60+
sdc_expanded_filename = args[++argidx];
61+
continue;
62+
}
63+
if (args[argidx] == "-verilog" && argidx+1 < args.size()) {
64+
verilog_filename = args[++argidx];
65+
continue;
66+
}
67+
if (args[argidx] == "-liberty" && argidx+1 < args.size()) {
68+
liberty_filename = args[++argidx];
69+
continue;
70+
}
71+
if (args[argidx] == "-nocleanup") {
72+
cleanup = false;
73+
continue;
74+
}
75+
break;
76+
}
77+
extra_args(args, argidx, design);
78+
if (!design->full_selection())
79+
log_cmd_error("This command only operates on fully selected designs!\n");
80+
81+
if (cleanup)
82+
tempdir_name = get_base_tmpdir() + "/";
83+
else
84+
tempdir_name = "_tmp_";
85+
tempdir_name += proc_program_prefix() + "yosys-opensta-XXXXXX";
86+
tempdir_name = make_temp_dir(tempdir_name);
87+
script_filename = tempdir_name + "/opensta.tcl";
88+
// script_filename
89+
90+
auto top_mod = design->top_module();
91+
if (!top_mod)
92+
log_error("Can't find top module in current design!\n");
93+
94+
std::ofstream f_script;
95+
f_script.open(script_filename);
96+
97+
f_script << "read_verilog " << verilog_filename << "\n";
98+
f_script << "read_lib " << liberty_filename << "\n";
99+
f_script << "link_design " << RTLIL::unescape_id(top_mod->name) << "\n";
100+
f_script << "read_sdc " << sdc_filename << "\n";
101+
f_script << "write_sdc " << sdc_expanded_filename << "\n";
102+
f_script.close();
103+
std::string command = opensta_exe + " -exit " + script_filename;
104+
int ret = run_command(command);
105+
if (ret)
106+
log_error("OpenSTA return %d (error)\n", ret);
107+
else
108+
log("sdc_expanded_filename: %s\n", sdc_expanded_filename.c_str());
109+
110+
// verilog_filename
111+
if (cleanup) {
112+
log("Removing temp directory.\n");
113+
remove_directory(tempdir_name);
114+
}
115+
log_pop();
116+
}
117+
} OpenstaPass;
118+
119+
PRIVATE_NAMESPACE_END

techlibs/common/sdc_expand.cc

Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
// #include "kernel/register.h"
2+
// #include "kernel/celltypes.h"
3+
#include "kernel/rtlil.h"
4+
#include "kernel/log.h"
5+
6+
USING_YOSYS_NAMESPACE
7+
PRIVATE_NAMESPACE_BEGIN
8+
9+
struct SdcexpandPass : public ScriptPass
10+
{
11+
const char* default_sta_cmd = "sta";
12+
SdcexpandPass() : ScriptPass("sdc_expand", "run OpenSTA") { }
13+
14+
void help() override
15+
{
16+
// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
17+
log("\n");
18+
log(" sdc_expand [options]\n");
19+
log("\n");
20+
// TODO
21+
log("\n");
22+
log(" -exe <command>\n");
23+
log(" use <command> to run OpenSTA instead of \"%s\"\n", default_sta_cmd);
24+
log("\n");
25+
log(" -sdc-in <filename>\n");
26+
log(" expand SDC file <filename>\n");
27+
log("\n");
28+
log(" -nocleanup\n");
29+
log("\n");
30+
log("\n");
31+
log("The following commands are executed by this synthesis command:\n");
32+
help_script();
33+
log("\n");
34+
}
35+
36+
string opensta_exe, sdc_filename, sdc_expanded_filename;
37+
bool cleanup;
38+
void execute(std::vector<std::string> args, RTLIL::Design *design) override
39+
{
40+
string run_from, run_to;
41+
cleanup = true;
42+
43+
size_t argidx;
44+
for (argidx = 1; argidx < args.size(); argidx++)
45+
{
46+
if (args[argidx] == "-exe" && argidx+1 < args.size()) {
47+
opensta_exe = args[++argidx];
48+
continue;
49+
}
50+
if (args[argidx] == "-sdc-in" && argidx+1 < args.size()) {
51+
sdc_filename = args[++argidx];
52+
continue;
53+
}
54+
if (args[argidx] == "-sdc-out" && argidx+1 < args.size()) {
55+
sdc_expanded_filename = args[++argidx];
56+
continue;
57+
}
58+
if (args[argidx] == "-nocleanup") {
59+
cleanup = false;
60+
continue;
61+
}
62+
// repetitive boring bit
63+
if (args[argidx] == "-run" && argidx+1 < args.size()) {
64+
size_t pos = args[argidx+1].find(':');
65+
if (pos == std::string::npos) {
66+
run_from = args[++argidx];
67+
run_to = args[argidx];
68+
} else {
69+
run_from = args[++argidx].substr(0, pos);
70+
run_to = args[argidx].substr(pos+1);
71+
}
72+
continue;
73+
}
74+
break;
75+
}
76+
extra_args(args, argidx, design);
77+
78+
if (!design->full_selection())
79+
log_cmd_error("This command only operates on fully selected designs!\n");
80+
81+
log_header(design, "Executing OPENSTA pass.\n");
82+
log_push();
83+
84+
run_script(design, run_from, run_to);
85+
86+
log_pop();
87+
}
88+
89+
void script() override
90+
{
91+
std::string tempdir_name;
92+
std::string liberty_path;
93+
std::string verilog_path;
94+
95+
run("design -save pre_expand");
96+
run("proc");
97+
run("memory");
98+
// run("dfflegalize -cell $dff");
99+
100+
std::string write_verilog_cmd = "write_verilog -norename -noexpr -attr2comment -defparam ";
101+
if (help_mode) {
102+
run(write_verilog_cmd + "<tmp_dir>/elaborated.v");
103+
} else {
104+
if (cleanup)
105+
tempdir_name = get_base_tmpdir() + "/";
106+
else
107+
tempdir_name = "_tmp_";
108+
tempdir_name += proc_program_prefix() + "yosys-sdc_expand-XXXXXX";
109+
tempdir_name = make_temp_dir(tempdir_name);
110+
verilog_path = tempdir_name + "/elaborated.v";
111+
run(write_verilog_cmd + verilog_path);
112+
}
113+
114+
run("read_verilog -setattr whitebox -defer -DSIMLIB_NOCHECKS +/simlib.v");
115+
run("proc");
116+
run("hierarchy -auto-top");
117+
run("publish");
118+
119+
if (help_mode) {
120+
run("icell_liberty <tmp_dir>/yosys.lib");
121+
} else {
122+
liberty_path = tempdir_name + "/yosys.lib";
123+
run(stringf("icell_liberty %s", liberty_path.c_str()));
124+
}
125+
126+
std::string opensta_pass_call = "opensta -exe ";
127+
opensta_pass_call += help_mode ? "<exe>" : opensta_exe;
128+
opensta_pass_call += " -sdc-in ";
129+
opensta_pass_call += help_mode ? "<sdc-in>" : sdc_filename;
130+
opensta_pass_call += " -sdc-out ";
131+
opensta_pass_call += help_mode ? "<sdc-out>" : sdc_expanded_filename;
132+
opensta_pass_call += " -verilog ";
133+
opensta_pass_call += help_mode ? "<verilog>" : verilog_path;
134+
opensta_pass_call += " -liberty ";
135+
opensta_pass_call += help_mode ? "<tmp_dir>/yosys.lib" : liberty_path;
136+
if (!cleanup)
137+
opensta_pass_call += " -nocleanup";
138+
run(opensta_pass_call.c_str());
139+
140+
if (cleanup) {
141+
log("Removing temp directory.\n");
142+
remove_directory(tempdir_name);
143+
} else {
144+
log("Keeping temp directory %s\n", tempdir_name.c_str());
145+
}
146+
run("design -load pre_expand");
147+
}
148+
} SdcexpandPass;
149+
150+
PRIVATE_NAMESPACE_END

0 commit comments

Comments
 (0)