mirror of
https://github.com/YosysHQ/yosys
synced 2025-04-13 04:28:18 +00:00
Add ice40_wrapcarry pass, rename $__ICE40_FULL_ADDER -> CARRY_WRAPPER
This commit is contained in:
parent
cc331cf70d
commit
675c1d4218
|
@ -1,4 +1,5 @@
|
||||||
OBJS += passes/pmgen/ice40_dsp.o
|
OBJS += passes/pmgen/ice40_dsp.o
|
||||||
|
OBJS += passes/pmgen/ice40_wrapcarry.o
|
||||||
OBJS += passes/pmgen/peepopt.o
|
OBJS += passes/pmgen/peepopt.o
|
||||||
|
|
||||||
# --------------------------------------
|
# --------------------------------------
|
||||||
|
@ -12,6 +13,15 @@ passes/pmgen/ice40_dsp_pm.h: passes/pmgen/pmgen.py passes/pmgen/ice40_dsp.pmg
|
||||||
|
|
||||||
# --------------------------------------
|
# --------------------------------------
|
||||||
|
|
||||||
|
passes/pmgen/ice40_wrapcarry.o: passes/pmgen/ice40_wrapcarry_pm.h
|
||||||
|
EXTRA_OBJS += passes/pmgen/ice40_wrapcarry_pm.h
|
||||||
|
.SECONDARY: passes/pmgen/ice40_wrapcarry_pm.h
|
||||||
|
|
||||||
|
passes/pmgen/ice40_wrapcarry_pm.h: passes/pmgen/pmgen.py passes/pmgen/ice40_wrapcarry.pmg
|
||||||
|
$(P) mkdir -p passes/pmgen && python3 $< -o $@ -p ice40_wrapcarry $(filter-out $<,$^)
|
||||||
|
|
||||||
|
# --------------------------------------
|
||||||
|
|
||||||
passes/pmgen/peepopt.o: passes/pmgen/peepopt_pm.h
|
passes/pmgen/peepopt.o: passes/pmgen/peepopt_pm.h
|
||||||
EXTRA_OBJS += passes/pmgen/peepopt_pm.h
|
EXTRA_OBJS += passes/pmgen/peepopt_pm.h
|
||||||
.SECONDARY: passes/pmgen/peepopt_pm.h
|
.SECONDARY: passes/pmgen/peepopt_pm.h
|
||||||
|
|
90
passes/pmgen/ice40_wrapcarry.cc
Normal file
90
passes/pmgen/ice40_wrapcarry.cc
Normal file
|
@ -0,0 +1,90 @@
|
||||||
|
/*
|
||||||
|
* yosys -- Yosys Open SYnthesis Suite
|
||||||
|
*
|
||||||
|
* Copyright (C) 2012 Clifford Wolf <clifford@clifford.at>
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and/or distribute this software for any
|
||||||
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
|
* copyright notice and this permission notice appear in all copies.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "kernel/yosys.h"
|
||||||
|
#include "kernel/sigtools.h"
|
||||||
|
|
||||||
|
USING_YOSYS_NAMESPACE
|
||||||
|
PRIVATE_NAMESPACE_BEGIN
|
||||||
|
|
||||||
|
#include "passes/pmgen/ice40_wrapcarry_pm.h"
|
||||||
|
|
||||||
|
void create_ice40_wrapcarry(ice40_wrapcarry_pm &pm)
|
||||||
|
{
|
||||||
|
auto &st = pm.st_ice40_wrapcarry;
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
log("\n");
|
||||||
|
log("carry: %s\n", log_id(st.carry, "--"));
|
||||||
|
log("lut: %s\n", log_id(st.lut, "--"));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
log(" replacing SB_LUT + SB_CARRY with $__ICE40_CARRY_WRAPPER cell.\n");
|
||||||
|
|
||||||
|
Cell *cell = pm.module->addCell(NEW_ID, "$__ICE40_CARRY_WRAPPER");
|
||||||
|
pm.module->swap_names(cell, st.carry);
|
||||||
|
|
||||||
|
cell->setPort("\\A", st.carry->getPort("\\I0"));
|
||||||
|
cell->setPort("\\B", st.carry->getPort("\\I1"));
|
||||||
|
cell->setPort("\\CI", st.carry->getPort("\\CI"));
|
||||||
|
cell->setPort("\\CO", st.carry->getPort("\\CO"));
|
||||||
|
|
||||||
|
cell->setPort("\\I0", st.lut->getPort("\\I0"));
|
||||||
|
cell->setPort("\\I3", st.lut->getPort("\\I3"));
|
||||||
|
cell->setPort("\\O", st.lut->getPort("\\O"));
|
||||||
|
cell->setParam("\\LUT", st.lut->getParam("\\LUT_INIT"));
|
||||||
|
|
||||||
|
pm.autoremove(st.carry);
|
||||||
|
pm.autoremove(st.lut);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Ice40WrapCarryPass : public Pass {
|
||||||
|
Ice40WrapCarryPass() : Pass("ice40_wrapcarry", "iCE40: wrap carries") { }
|
||||||
|
void help() YS_OVERRIDE
|
||||||
|
{
|
||||||
|
// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
|
||||||
|
log("\n");
|
||||||
|
log(" ice40_wrapcarry [selection]\n");
|
||||||
|
log("\n");
|
||||||
|
log("Wrap manually instantiated SB_CARRY cells, along with their associated SB_LUTs,\n");
|
||||||
|
log("into an internal $__ICE40_CARRY_WRAPPER cell for preservation across technology\n");
|
||||||
|
log("mapping.");
|
||||||
|
log("\n");
|
||||||
|
}
|
||||||
|
void execute(std::vector<std::string> args, RTLIL::Design *design) YS_OVERRIDE
|
||||||
|
{
|
||||||
|
log_header(design, "Executing ICE40_WRAPCARRY pass (wrap carries).\n");
|
||||||
|
|
||||||
|
size_t argidx;
|
||||||
|
for (argidx = 1; argidx < args.size(); argidx++)
|
||||||
|
{
|
||||||
|
// if (args[argidx] == "-singleton") {
|
||||||
|
// singleton_mode = true;
|
||||||
|
// continue;
|
||||||
|
// }
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
extra_args(args, argidx, design);
|
||||||
|
|
||||||
|
for (auto module : design->selected_modules())
|
||||||
|
ice40_wrapcarry_pm(module, module->selected_cells()).run_ice40_wrapcarry(create_ice40_wrapcarry);
|
||||||
|
}
|
||||||
|
} Ice40WrapCarryPass;
|
||||||
|
|
||||||
|
PRIVATE_NAMESPACE_END
|
11
passes/pmgen/ice40_wrapcarry.pmg
Normal file
11
passes/pmgen/ice40_wrapcarry.pmg
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
pattern ice40_wrapcarry
|
||||||
|
|
||||||
|
match carry
|
||||||
|
select carry->type.in(\SB_CARRY)
|
||||||
|
endmatch
|
||||||
|
|
||||||
|
match lut
|
||||||
|
select lut->type.in(\SB_LUT4)
|
||||||
|
index <SigSpec> port(lut, \I1) === port(carry, \I0)
|
||||||
|
index <SigSpec> port(lut, \I2) === port(carry, \I1)
|
||||||
|
endmatch
|
|
@ -44,10 +44,18 @@ module _80_ice40_alu (A, B, CI, BI, X, Y, CO);
|
||||||
|
|
||||||
genvar i;
|
genvar i;
|
||||||
generate for (i = 0; i < Y_WIDTH; i = i + 1) begin:slice
|
generate for (i = 0; i < Y_WIDTH; i = i + 1) begin:slice
|
||||||
\$__ICE40_FULL_ADDER carry (
|
\$__ICE40_CARRY_WRAPPER #(
|
||||||
|
// A[0]: 1010 1010 1010 1010
|
||||||
|
// A[1]: 1100 1100 1100 1100
|
||||||
|
// A[2]: 1111 0000 1111 0000
|
||||||
|
// A[3]: 1111 1111 0000 0000
|
||||||
|
.LUT(16'b 0110_1001_1001_0110)
|
||||||
|
) fadd (
|
||||||
.A(AA[i]),
|
.A(AA[i]),
|
||||||
.B(BB[i]),
|
.B(BB[i]),
|
||||||
.CI(C[i]),
|
.CI(C[i]),
|
||||||
|
.I0(1'b0),
|
||||||
|
.I3(C[i]),
|
||||||
.CO(CO[i]),
|
.CO(CO[i]),
|
||||||
.O(Y[i])
|
.O(Y[i])
|
||||||
);
|
);
|
||||||
|
|
|
@ -63,7 +63,8 @@ endmodule
|
||||||
`endif
|
`endif
|
||||||
|
|
||||||
`ifndef NO_ADDER
|
`ifndef NO_ADDER
|
||||||
module \$__ICE40_FULL_ADDER (output CO, O, input A, B, CI);
|
module \$__ICE40_CARRY_WRAPPER (output CO, O, input A, B, CI, I0, I3);
|
||||||
|
parameter LUT = 0;
|
||||||
SB_CARRY carry (
|
SB_CARRY carry (
|
||||||
.I0(A),
|
.I0(A),
|
||||||
.I1(B),
|
.I1(B),
|
||||||
|
@ -72,13 +73,9 @@ module \$__ICE40_FULL_ADDER (output CO, O, input A, B, CI);
|
||||||
);
|
);
|
||||||
\$lut #(
|
\$lut #(
|
||||||
.WIDTH(4),
|
.WIDTH(4),
|
||||||
// A[0]: 1010 1010 1010 1010
|
.LUT(LUT)
|
||||||
// A[1]: 1100 1100 1100 1100
|
) lut (
|
||||||
// A[2]: 1111 0000 1111 0000
|
.A({I3,B,A,I0}),
|
||||||
// A[3]: 1111 1111 0000 0000
|
|
||||||
.LUT(16'b 0110_1001_1001_0110)
|
|
||||||
) adder (
|
|
||||||
.A({CI,B,A,1'b0}),
|
|
||||||
.Y(O)
|
.Y(O)
|
||||||
);
|
);
|
||||||
endmodule
|
endmodule
|
||||||
|
|
|
@ -293,8 +293,10 @@ struct SynthIce40Pass : public ScriptPass
|
||||||
{
|
{
|
||||||
if (nocarry)
|
if (nocarry)
|
||||||
run("techmap");
|
run("techmap");
|
||||||
else
|
else {
|
||||||
|
run("ice40_wrapcarry");
|
||||||
run("techmap -map +/techmap.v -map +/ice40/arith_map.v");
|
run("techmap -map +/techmap.v -map +/ice40/arith_map.v");
|
||||||
|
}
|
||||||
if (retime || help_mode)
|
if (retime || help_mode)
|
||||||
run(abc + " -dff", "(only if -retime)");
|
run(abc + " -dff", "(only if -retime)");
|
||||||
run("ice40_opt");
|
run("ice40_opt");
|
||||||
|
|
Loading…
Reference in a new issue