mirror of
https://github.com/YosysHQ/yosys
synced 2025-04-13 04:28:18 +00:00
Merge pull request #537 from mithro/yosys-vpr
Improving Yosys when used with VPR
This commit is contained in:
commit
47eb150eec
|
@ -27,7 +27,7 @@ module \$__DFFE_NP1 (input D, C, E, R, output Q); SB_DFFNES _TECHMAP_REPLACE_ (
|
||||||
module \$__DFFE_PP0 (input D, C, E, R, output Q); SB_DFFER _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .E(E), .R(R)); endmodule
|
module \$__DFFE_PP0 (input D, C, E, R, output Q); SB_DFFER _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .E(E), .R(R)); endmodule
|
||||||
module \$__DFFE_PP1 (input D, C, E, R, output Q); SB_DFFES _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .E(E), .S(R)); endmodule
|
module \$__DFFE_PP1 (input D, C, E, R, output Q); SB_DFFES _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .E(E), .S(R)); endmodule
|
||||||
|
|
||||||
`ifndef NO_SB_LUT4
|
`ifndef NO_LUT
|
||||||
module \$lut (A, Y);
|
module \$lut (A, Y);
|
||||||
parameter WIDTH = 0;
|
parameter WIDTH = 0;
|
||||||
parameter LUT = 0;
|
parameter LUT = 0;
|
||||||
|
|
|
@ -219,7 +219,7 @@ struct SynthIce40Pass : public ScriptPass
|
||||||
run("dffsr2dff");
|
run("dffsr2dff");
|
||||||
if (!nodffe)
|
if (!nodffe)
|
||||||
run("dff2dffe -direct-match $_DFF_*");
|
run("dff2dffe -direct-match $_DFF_*");
|
||||||
run("techmap -D NO_SB_LUT4 -map +/ice40/cells_map.v");
|
run("techmap -D NO_LUT -map +/ice40/cells_map.v");
|
||||||
run("opt_expr -mux_undef");
|
run("opt_expr -mux_undef");
|
||||||
run("simplemap");
|
run("simplemap");
|
||||||
run("ice40_ffinit");
|
run("ice40_ffinit");
|
||||||
|
@ -241,9 +241,9 @@ struct SynthIce40Pass : public ScriptPass
|
||||||
if (check_label("map_cells"))
|
if (check_label("map_cells"))
|
||||||
{
|
{
|
||||||
if (vpr)
|
if (vpr)
|
||||||
run("techmap -D NO_SB_LUT4 -map +/ice40/cells_map.v");
|
run("techmap -D NO_LUT -map +/ice40/cells_map.v");
|
||||||
else
|
else
|
||||||
run("techmap -map +/ice40/cells_map.v", "(with -D NO_SB_LUT4 in vpr mode)");
|
run("techmap -map +/ice40/cells_map.v", "(with -D NO_LUT in vpr mode)");
|
||||||
|
|
||||||
run("clean");
|
run("clean");
|
||||||
}
|
}
|
||||||
|
@ -260,13 +260,17 @@ struct SynthIce40Pass : public ScriptPass
|
||||||
if (!blif_file.empty() || help_mode) {
|
if (!blif_file.empty() || help_mode) {
|
||||||
if (vpr || help_mode) {
|
if (vpr || help_mode) {
|
||||||
run(stringf("opt_clean -purge"),
|
run(stringf("opt_clean -purge"),
|
||||||
" (vpr mode)");
|
" "
|
||||||
run(stringf("write_blif %s", help_mode ? "<file-name>" : blif_file.c_str()),
|
" (vpr mode)");
|
||||||
" (vpr mode)");
|
run(stringf("write_blif -attr -cname -conn -param %s",
|
||||||
|
help_mode ? "<file-name>" : blif_file.c_str()),
|
||||||
|
" (vpr mode)");
|
||||||
}
|
}
|
||||||
if (!vpr)
|
if (!vpr)
|
||||||
run(stringf("write_blif -gates -attr -param %s",
|
run(stringf("write_blif -gates -attr -param %s",
|
||||||
help_mode ? "<file-name>" : blif_file.c_str()), "(non-vpr mode)");
|
help_mode ? "<file-name>" : blif_file.c_str()),
|
||||||
|
" "
|
||||||
|
" (non-vpr mode)");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,7 @@ module \$_DFF_NP1_ (input D, C, R, output Q); FDPE #(.INIT(|0), .IS_C_INVERTED(
|
||||||
module \$_DFF_PN1_ (input D, C, R, output Q); FDPE #(.INIT(|0), .IS_C_INVERTED(|0), .IS_D_INVERTED(|0), .IS_PRE_INVERTED(|1)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(1'b1), .PRE(R)); endmodule
|
module \$_DFF_PN1_ (input D, C, R, output Q); FDPE #(.INIT(|0), .IS_C_INVERTED(|0), .IS_D_INVERTED(|0), .IS_PRE_INVERTED(|1)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(1'b1), .PRE(R)); endmodule
|
||||||
module \$_DFF_PP1_ (input D, C, R, output Q); FDPE #(.INIT(|0), .IS_C_INVERTED(|0), .IS_D_INVERTED(|0), .IS_PRE_INVERTED(|0)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(1'b1), .PRE(R)); endmodule
|
module \$_DFF_PP1_ (input D, C, R, output Q); FDPE #(.INIT(|0), .IS_C_INVERTED(|0), .IS_D_INVERTED(|0), .IS_PRE_INVERTED(|0)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(1'b1), .PRE(R)); endmodule
|
||||||
|
|
||||||
|
`ifndef NO_LUT
|
||||||
module \$lut (A, Y);
|
module \$lut (A, Y);
|
||||||
parameter WIDTH = 0;
|
parameter WIDTH = 0;
|
||||||
parameter LUT = 0;
|
parameter LUT = 0;
|
||||||
|
@ -82,3 +83,4 @@ module \$lut (A, Y);
|
||||||
end
|
end
|
||||||
endgenerate
|
endgenerate
|
||||||
endmodule
|
endmodule
|
||||||
|
`endif
|
||||||
|
|
|
@ -34,8 +34,10 @@ bool check_label(bool &active, std::string run_from, std::string run_to, std::st
|
||||||
return active;
|
return active;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct SynthXilinxPass : public Pass {
|
struct SynthXilinxPass : public Pass
|
||||||
|
{
|
||||||
SynthXilinxPass() : Pass("synth_xilinx", "synthesis for Xilinx FPGAs") { }
|
SynthXilinxPass() : Pass("synth_xilinx", "synthesis for Xilinx FPGAs") { }
|
||||||
|
|
||||||
virtual void help()
|
virtual void help()
|
||||||
{
|
{
|
||||||
// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
|
// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
|
||||||
|
@ -53,6 +55,14 @@ struct SynthXilinxPass : public Pass {
|
||||||
log(" write the design to the specified edif file. writing of an output file\n");
|
log(" write the design to the specified edif file. writing of an output file\n");
|
||||||
log(" is omitted if this parameter is not specified.\n");
|
log(" is omitted if this parameter is not specified.\n");
|
||||||
log("\n");
|
log("\n");
|
||||||
|
log(" -blif <file>\n");
|
||||||
|
log(" write the design to the specified BLIF file. writing of an output file\n");
|
||||||
|
log(" is omitted if this parameter is not specified.\n");
|
||||||
|
log("\n");
|
||||||
|
log(" -vpr\n");
|
||||||
|
log(" generate an output netlist (and BLIF file) suitable for VPR\n");
|
||||||
|
log(" (this feature is experimental and incomplete)\n");
|
||||||
|
log("\n");
|
||||||
log(" -run <from_label>:<to_label>\n");
|
log(" -run <from_label>:<to_label>\n");
|
||||||
log(" only run the commands between the labels (see below). an empty\n");
|
log(" only run the commands between the labels (see below). an empty\n");
|
||||||
log(" from label is synonymous to 'begin', and empty to label is\n");
|
log(" from label is synonymous to 'begin', and empty to label is\n");
|
||||||
|
@ -102,7 +112,7 @@ struct SynthXilinxPass : public Pass {
|
||||||
log(" clean\n");
|
log(" clean\n");
|
||||||
log("\n");
|
log("\n");
|
||||||
log(" map_cells:\n");
|
log(" map_cells:\n");
|
||||||
log(" techmap -map +/xilinx/cells_map.v\n");
|
log(" techmap -map +/xilinx/cells_map.v (with -D NO_LUT in vpr mode)\n");
|
||||||
log(" dffinit -ff FDRE Q INIT -ff FDCE Q INIT -ff FDPE Q INIT\n");
|
log(" dffinit -ff FDRE Q INIT -ff FDCE Q INIT -ff FDPE Q INIT\n");
|
||||||
log(" clean\n");
|
log(" clean\n");
|
||||||
log("\n");
|
log("\n");
|
||||||
|
@ -114,14 +124,19 @@ struct SynthXilinxPass : public Pass {
|
||||||
log(" edif: (only if -edif)\n");
|
log(" edif: (only if -edif)\n");
|
||||||
log(" write_edif <file-name>\n");
|
log(" write_edif <file-name>\n");
|
||||||
log("\n");
|
log("\n");
|
||||||
|
log(" blif: (only if -blif)\n");
|
||||||
|
log(" write_blif <file-name>\n");
|
||||||
|
log("\n");
|
||||||
}
|
}
|
||||||
virtual void execute(std::vector<std::string> args, RTLIL::Design *design)
|
virtual void execute(std::vector<std::string> args, RTLIL::Design *design)
|
||||||
{
|
{
|
||||||
std::string top_opt = "-auto-top";
|
std::string top_opt = "-auto-top";
|
||||||
std::string edif_file;
|
std::string edif_file;
|
||||||
|
std::string blif_file;
|
||||||
std::string run_from, run_to;
|
std::string run_from, run_to;
|
||||||
bool flatten = false;
|
bool flatten = false;
|
||||||
bool retime = false;
|
bool retime = false;
|
||||||
|
bool vpr = false;
|
||||||
|
|
||||||
size_t argidx;
|
size_t argidx;
|
||||||
for (argidx = 1; argidx < args.size(); argidx++)
|
for (argidx = 1; argidx < args.size(); argidx++)
|
||||||
|
@ -134,6 +149,10 @@ struct SynthXilinxPass : public Pass {
|
||||||
edif_file = args[++argidx];
|
edif_file = args[++argidx];
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (args[argidx] == "-blif" && argidx+1 < args.size()) {
|
||||||
|
blif_file = args[++argidx];
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (args[argidx] == "-run" && argidx+1 < args.size()) {
|
if (args[argidx] == "-run" && argidx+1 < args.size()) {
|
||||||
size_t pos = args[argidx+1].find(':');
|
size_t pos = args[argidx+1].find(':');
|
||||||
if (pos == std::string::npos)
|
if (pos == std::string::npos)
|
||||||
|
@ -150,6 +169,10 @@ struct SynthXilinxPass : public Pass {
|
||||||
retime = true;
|
retime = true;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (args[argidx] == "-vpr") {
|
||||||
|
vpr = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
extra_args(args, argidx, design);
|
extra_args(args, argidx, design);
|
||||||
|
@ -212,7 +235,10 @@ struct SynthXilinxPass : public Pass {
|
||||||
|
|
||||||
if (check_label(active, run_from, run_to, "map_cells"))
|
if (check_label(active, run_from, run_to, "map_cells"))
|
||||||
{
|
{
|
||||||
Pass::call(design, "techmap -map +/xilinx/cells_map.v");
|
if (vpr)
|
||||||
|
Pass::call(design, "techmap -D NO_LUT -map +/xilinx/cells_map.v");
|
||||||
|
else
|
||||||
|
Pass::call(design, "techmap -map +/xilinx/cells_map.v");
|
||||||
Pass::call(design, "dffinit -ff FDRE Q INIT -ff FDCE Q INIT -ff FDPE Q INIT");
|
Pass::call(design, "dffinit -ff FDRE Q INIT -ff FDCE Q INIT -ff FDPE Q INIT");
|
||||||
Pass::call(design, "clean");
|
Pass::call(design, "clean");
|
||||||
}
|
}
|
||||||
|
@ -229,6 +255,11 @@ struct SynthXilinxPass : public Pass {
|
||||||
if (!edif_file.empty())
|
if (!edif_file.empty())
|
||||||
Pass::call(design, stringf("write_edif %s", edif_file.c_str()));
|
Pass::call(design, stringf("write_edif %s", edif_file.c_str()));
|
||||||
}
|
}
|
||||||
|
if (check_label(active, run_from, run_to, "blif"))
|
||||||
|
{
|
||||||
|
if (!blif_file.empty())
|
||||||
|
Pass::call(design, stringf("write_blif %s", edif_file.c_str()));
|
||||||
|
}
|
||||||
|
|
||||||
log_pop();
|
log_pop();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue