+++ /dev/null
-
-module \$__XILINX_RAM32X1D (CLK1, A1ADDR, A1DATA, B1ADDR, B1DATA, B1EN);
- parameter [31:0] INIT = 32'bx;
- parameter CLKPOL2 = 1;
- input CLK1;
-
- input [4:0] A1ADDR;
- output A1DATA;
-
- input [4:0] B1ADDR;
- input B1DATA;
- input B1EN;
-
- RAM32X1D #(
- .INIT(INIT),
- .IS_WCLK_INVERTED(!CLKPOL2)
- ) _TECHMAP_REPLACE_ (
- .DPRA0(A1ADDR[0]),
- .DPRA1(A1ADDR[1]),
- .DPRA2(A1ADDR[2]),
- .DPRA3(A1ADDR[3]),
- .DPRA4(A1ADDR[4]),
- .DPO(A1DATA),
-
- .A0(B1ADDR[0]),
- .A1(B1ADDR[1]),
- .A2(B1ADDR[2]),
- .A3(B1ADDR[3]),
- .A4(B1ADDR[4]),
- .D(B1DATA),
- .WCLK(CLK1),
- .WE(B1EN)
- );
-endmodule
-
-module \$__XILINX_RAM64X1D (CLK1, A1ADDR, A1DATA, B1ADDR, B1DATA, B1EN);
- parameter [63:0] INIT = 64'bx;
- parameter CLKPOL2 = 1;
- input CLK1;
-
- input [5:0] A1ADDR;
- output A1DATA;
-
- input [5:0] B1ADDR;
- input B1DATA;
- input B1EN;
-
- RAM64X1D #(
- .INIT(INIT),
- .IS_WCLK_INVERTED(!CLKPOL2)
- ) _TECHMAP_REPLACE_ (
- .DPRA0(A1ADDR[0]),
- .DPRA1(A1ADDR[1]),
- .DPRA2(A1ADDR[2]),
- .DPRA3(A1ADDR[3]),
- .DPRA4(A1ADDR[4]),
- .DPRA5(A1ADDR[5]),
- .DPO(A1DATA),
-
- .A0(B1ADDR[0]),
- .A1(B1ADDR[1]),
- .A2(B1ADDR[2]),
- .A3(B1ADDR[3]),
- .A4(B1ADDR[4]),
- .A5(B1ADDR[5]),
- .D(B1DATA),
- .WCLK(CLK1),
- .WE(B1EN)
- );
-endmodule
-
-module \$__XILINX_RAM128X1D (CLK1, A1ADDR, A1DATA, B1ADDR, B1DATA, B1EN);
- parameter [127:0] INIT = 128'bx;
- parameter CLKPOL2 = 1;
- input CLK1;
-
- input [6:0] A1ADDR;
- output A1DATA;
-
- input [6:0] B1ADDR;
- input B1DATA;
- input B1EN;
-
- RAM128X1D #(
- .INIT(INIT),
- .IS_WCLK_INVERTED(!CLKPOL2)
- ) _TECHMAP_REPLACE_ (
- .DPRA(A1ADDR),
- .DPO(A1DATA),
-
- .A(B1ADDR),
- .D(B1DATA),
- .WCLK(CLK1),
- .WE(B1EN)
- );
-endmodule
-
--- /dev/null
+
+module \$__XILINX_RAM32X1D (CLK1, A1ADDR, A1DATA, B1ADDR, B1DATA, B1EN);
+ parameter [31:0] INIT = 32'bx;
+ parameter CLKPOL2 = 1;
+ input CLK1;
+
+ input [4:0] A1ADDR;
+ output A1DATA;
+
+ input [4:0] B1ADDR;
+ input B1DATA;
+ input B1EN;
+
+ RAM32X1D #(
+ .INIT(INIT),
+ .IS_WCLK_INVERTED(!CLKPOL2)
+ ) _TECHMAP_REPLACE_ (
+ .DPRA0(A1ADDR[0]),
+ .DPRA1(A1ADDR[1]),
+ .DPRA2(A1ADDR[2]),
+ .DPRA3(A1ADDR[3]),
+ .DPRA4(A1ADDR[4]),
+ .DPO(A1DATA),
+
+ .A0(B1ADDR[0]),
+ .A1(B1ADDR[1]),
+ .A2(B1ADDR[2]),
+ .A3(B1ADDR[3]),
+ .A4(B1ADDR[4]),
+ .D(B1DATA),
+ .WCLK(CLK1),
+ .WE(B1EN)
+ );
+endmodule
+
+module \$__XILINX_RAM64X1D (CLK1, A1ADDR, A1DATA, B1ADDR, B1DATA, B1EN);
+ parameter [63:0] INIT = 64'bx;
+ parameter CLKPOL2 = 1;
+ input CLK1;
+
+ input [5:0] A1ADDR;
+ output A1DATA;
+
+ input [5:0] B1ADDR;
+ input B1DATA;
+ input B1EN;
+
+ RAM64X1D #(
+ .INIT(INIT),
+ .IS_WCLK_INVERTED(!CLKPOL2)
+ ) _TECHMAP_REPLACE_ (
+ .DPRA0(A1ADDR[0]),
+ .DPRA1(A1ADDR[1]),
+ .DPRA2(A1ADDR[2]),
+ .DPRA3(A1ADDR[3]),
+ .DPRA4(A1ADDR[4]),
+ .DPRA5(A1ADDR[5]),
+ .DPO(A1DATA),
+
+ .A0(B1ADDR[0]),
+ .A1(B1ADDR[1]),
+ .A2(B1ADDR[2]),
+ .A3(B1ADDR[3]),
+ .A4(B1ADDR[4]),
+ .A5(B1ADDR[5]),
+ .D(B1DATA),
+ .WCLK(CLK1),
+ .WE(B1EN)
+ );
+endmodule
+
+module \$__XILINX_RAM128X1D (CLK1, A1ADDR, A1DATA, B1ADDR, B1DATA, B1EN);
+ parameter [127:0] INIT = 128'bx;
+ parameter CLKPOL2 = 1;
+ input CLK1;
+
+ input [6:0] A1ADDR;
+ output A1DATA;
+
+ input [6:0] B1ADDR;
+ input B1DATA;
+ input B1EN;
+
+ RAM128X1D #(
+ .INIT(INIT),
+ .IS_WCLK_INVERTED(!CLKPOL2)
+ ) _TECHMAP_REPLACE_ (
+ .DPRA(A1ADDR),
+ .DPO(A1DATA),
+
+ .A(B1ADDR),
+ .D(B1DATA),
+ .WCLK(CLK1),
+ .WE(B1EN)
+ );
+endmodule
+
log(" (this feature is experimental and incomplete)\n");
log("\n");
log(" -nobram\n");
- log(" disable inference of block rams\n");
+ log(" do not use block RAM cells in output netlist\n");
log("\n");
- log(" -nodram\n");
- log(" disable inference of distributed rams\n");
+ log(" -nolutram\n");
+ log(" do not use distributed RAM cells in output netlist\n");
log("\n");
log(" -nosrl\n");
- log(" disable inference of shift registers\n");
+ log(" do not use distributed SRL cells in output netlist\n");
log("\n");
log(" -nocarry\n");
log(" do not use XORCY/MUXCY/CARRY4 cells in output netlist\n");
}
std::string top_opt, edif_file, blif_file, family;
- bool flatten, retime, vpr, nobram, nodram, nosrl, nocarry, nowidelut, abc9;
+ bool flatten, retime, vpr, nobram, nolutram, nosrl, nocarry, nowidelut, abc9;
int widemux;
void clear_flags() YS_OVERRIDE
vpr = false;
nocarry = false;
nobram = false;
- nodram = false;
+ nolutram = false;
nosrl = false;
nocarry = false;
nowidelut = false;
nobram = true;
continue;
}
- if (args[argidx] == "-nodram") {
- nodram = true;
+ if (args[argidx] == "-nolutram" || /*deprecated alias*/ args[argidx] == "-nodram") {
+ nolutram = true;
continue;
}
if (args[argidx] == "-nosrl") {
run("opt_clean");
}
- if (check_label("bram", "(skip if '-nobram')")) {
+ if (check_label("map_bram", "(skip if '-nobram')")) {
if (help_mode) {
run("memory_bram -rules +/xilinx/{family}_brams.txt");
run("techmap -map +/xilinx/{family}_brams_map.v");
}
}
- if (check_label("dram", "(skip if '-nodram')")) {
- if (!nodram || help_mode) {
- run("memory_bram -rules +/xilinx/drams.txt");
- run("techmap -map +/xilinx/drams_map.v");
+ if (check_label("map_lutram", "(skip if '-nolutram')")) {
+ if (!nolutram || help_mode) {
+ run("memory_bram -rules +/xilinx/lutrams.txt");
+ run("techmap -map +/xilinx/lutrams_map.v");
}
}
- if (check_label("fine")) {
+ if (check_label("map_ffram")) {
if (widemux > 0)
run("opt -fast -mux_bool -undriven -fine"); // Necessary to omit -mux_undef otherwise muxcover
// performs less efficiently
else
run("opt -fast -full");
run("memory_map");
+ }
+
+ if (check_label("fine")) {
run("dffsr2dff");
run("dff2dffe");
if (help_mode) {