mirror of https://github.com/YosysHQ/yosys.git
Revert "Try using an ICE40_CARRY_LUT primitive to avoid ABC issues"
This reverts commit a7632ab332
.
This commit is contained in:
parent
a7632ab332
commit
c1ebe51a75
|
@ -44,32 +44,25 @@ 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_CARRY_LUT carry_lut (
|
SB_CARRY carry (
|
||||||
|
.I0(AA[i]),
|
||||||
|
.I1(BB[i]),
|
||||||
|
.CI(C[i]),
|
||||||
|
.CO(CO[i])
|
||||||
|
);
|
||||||
|
SB_LUT4 #(
|
||||||
|
// I0: 1010 1010 1010 1010
|
||||||
|
// I1: 1100 1100 1100 1100
|
||||||
|
// I2: 1111 0000 1111 0000
|
||||||
|
// I3: 1111 1111 0000 0000
|
||||||
|
.LUT_INIT(16'b 0110_1001_1001_0110)
|
||||||
|
) adder (
|
||||||
|
.I0(1'b0),
|
||||||
.I1(AA[i]),
|
.I1(AA[i]),
|
||||||
.I2(BB[i]),
|
.I2(BB[i]),
|
||||||
.CI(C[i]),
|
.I3(C[i]),
|
||||||
.CO(CO[i]),
|
|
||||||
.O(Y[i])
|
.O(Y[i])
|
||||||
);
|
);
|
||||||
// SB_CARRY carry (
|
|
||||||
// .I0(AA[i]),
|
|
||||||
// .I1(BB[i]),
|
|
||||||
// .CI(C[i]),
|
|
||||||
// .CO(CO[i])
|
|
||||||
// );
|
|
||||||
// SB_LUT4 #(
|
|
||||||
// // I0: 1010 1010 1010 1010
|
|
||||||
// // I1: 1100 1100 1100 1100
|
|
||||||
// // I2: 1111 0000 1111 0000
|
|
||||||
// // I3: 1111 1111 0000 0000
|
|
||||||
// .LUT_INIT(16'b 0110_1001_1001_0110)
|
|
||||||
// ) adder (
|
|
||||||
// .I0(1'b0),
|
|
||||||
// .I1(AA[i]),
|
|
||||||
// .I2(BB[i]),
|
|
||||||
// .I3(C[i]),
|
|
||||||
// .O(Y[i])
|
|
||||||
// );
|
|
||||||
end endgenerate
|
end endgenerate
|
||||||
|
|
||||||
assign X = AA ^ BB;
|
assign X = AA ^ BB;
|
||||||
|
|
|
@ -2,8 +2,12 @@
|
||||||
|
|
||||||
# NB: Inputs/Outputs must be ordered alphabetically
|
# NB: Inputs/Outputs must be ordered alphabetically
|
||||||
|
|
||||||
# Inputs: CI I1 I2
|
# Inputs: CI I0 I1
|
||||||
# Outputs: CO O
|
# Outputs: CO
|
||||||
ICE40_CARRY_LUT 1 1 3 2
|
SB_CARRY 1 1 3 1
|
||||||
126 259 231
|
126 259 231
|
||||||
316 400 379
|
|
||||||
|
# Inputs: I0 I1 I2 I3
|
||||||
|
# Outputs: O
|
||||||
|
SB_LUT4 2 1 4 1
|
||||||
|
316 379 400 449
|
||||||
|
|
|
@ -1,18 +1,12 @@
|
||||||
(* abc_box_id = 1 *)
|
(* abc_box_id = 1 *)
|
||||||
module ICE40_CARRY_LUT (output CO, O, input CI, I1, I2);
|
module SB_CARRY (output CO, input CI, I0, I1);
|
||||||
assign CO = (I1 && I2) || ((I1 || I2) && CI);
|
assign CO = (I0 && I1) || ((I0 || I1) && CI);
|
||||||
|
|
||||||
wire I0, I3;
|
|
||||||
assign I0 = 1'b0;
|
|
||||||
assign I3 = CI;
|
|
||||||
|
|
||||||
// I0: 1010 1010 1010 1010
|
|
||||||
// I1: 1100 1100 1100 1100
|
|
||||||
// I2: 1111 0000 1111 0000
|
|
||||||
// I3: 1111 1111 0000 0000
|
|
||||||
localparam [15:0] LUT_INIT = 16'b 0110_1001_1001_0110;
|
|
||||||
wire [7:0] s3 = I3 ? LUT_INIT[15:8] : LUT_INIT[7:0];
|
|
||||||
wire [3:0] s2 = I2 ? s3[ 7:4] : s3[3:0];
|
|
||||||
wire [1:0] s1 = I1 ? s2[ 3:2] : s2[1:0];
|
|
||||||
assign O = I0 ? s1[1] : s1[0];
|
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
|
(* abc_box_id = 2 *)
|
||||||
|
module SB_LUT4 (output O, input I0, I1, I2, I3);
|
||||||
|
parameter [15:0] LUT_INIT = 0;
|
||||||
|
// Indicate this is a black-box
|
||||||
|
assign O = 1'b0;
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
|
|
@ -57,27 +57,3 @@ module \$lut (A, Y);
|
||||||
endgenerate
|
endgenerate
|
||||||
endmodule
|
endmodule
|
||||||
`endif
|
`endif
|
||||||
|
|
||||||
`ifndef NO_CARRY
|
|
||||||
module ICE40_CARRY_LUT (output CO, O, input CI, I1, I2);
|
|
||||||
SB_CARRY carry (
|
|
||||||
.I0(I1),
|
|
||||||
.I1(I2),
|
|
||||||
.CI(CI),
|
|
||||||
.CO(CO),
|
|
||||||
);
|
|
||||||
SB_LUT4 #(
|
|
||||||
// I0: 1010 1010 1010 1010
|
|
||||||
// I1: 1100 1100 1100 1100
|
|
||||||
// I2: 1111 0000 1111 0000
|
|
||||||
// I3: 1111 1111 0000 0000
|
|
||||||
.LUT_INIT(16'b 0110_1001_1001_0110)
|
|
||||||
) adder (
|
|
||||||
.I0(1'b0),
|
|
||||||
.I1(I1),
|
|
||||||
.I2(I2),
|
|
||||||
.I3(CI),
|
|
||||||
.O(O)
|
|
||||||
);
|
|
||||||
endmodule
|
|
||||||
`endif
|
|
||||||
|
|
|
@ -1384,25 +1384,3 @@ module SB_MAC16 (
|
||||||
assign LCI = (BOTADDSUB_CARRYSELECT == 0) ? 1'b0 : (BOTADDSUB_CARRYSELECT == 1) ? 1'b1 : (BOTADDSUB_CARRYSELECT == 2) ? ACCUMCI : CI;
|
assign LCI = (BOTADDSUB_CARRYSELECT == 0) ? 1'b0 : (BOTADDSUB_CARRYSELECT == 1) ? 1'b1 : (BOTADDSUB_CARRYSELECT == 2) ? ACCUMCI : CI;
|
||||||
assign O = {Oh, Ol};
|
assign O = {Oh, Ol};
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
module ICE40_CARRY_LUT (input CI, input I1, input I2, output CO, output O);
|
|
||||||
SB_CARRY carry (
|
|
||||||
.I0(I1),
|
|
||||||
.I1(I2),
|
|
||||||
.CI(CI),
|
|
||||||
.CO(CO),
|
|
||||||
);
|
|
||||||
SB_LUT4 #(
|
|
||||||
// I0: 1010 1010 1010 1010
|
|
||||||
// I1: 1100 1100 1100 1100
|
|
||||||
// I2: 1111 0000 1111 0000
|
|
||||||
// I3: 1111 1111 0000 0000
|
|
||||||
.LUT_INIT(16'b 0110_1001_1001_0110)
|
|
||||||
) adder (
|
|
||||||
.I0(1'b0),
|
|
||||||
.I1(I1),
|
|
||||||
.I2(I2),
|
|
||||||
.I3(CI),
|
|
||||||
.O(O)
|
|
||||||
);
|
|
||||||
endmodule
|
|
||||||
|
|
|
@ -47,20 +47,16 @@ static void run_ice40_opts(Module *module)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cell->type.in("\\SB_CARRY", "\\ICE40_CARRY_LUT"))
|
if (cell->type == "\\SB_CARRY")
|
||||||
{
|
{
|
||||||
SigSpec non_const_inputs, replacement_output;
|
SigSpec non_const_inputs, replacement_output;
|
||||||
int count_zeros = 0, count_ones = 0;
|
int count_zeros = 0, count_ones = 0;
|
||||||
|
|
||||||
SigBit inbit[3] = {
|
SigBit inbit[3] = {
|
||||||
|
get_bit_or_zero(cell->getPort("\\I0")),
|
||||||
get_bit_or_zero(cell->getPort("\\I1")),
|
get_bit_or_zero(cell->getPort("\\I1")),
|
||||||
get_bit_or_zero(cell->getPort("\\CI"))
|
get_bit_or_zero(cell->getPort("\\CI"))
|
||||||
};
|
};
|
||||||
if (cell->type == "\\SB_CARRY")
|
|
||||||
inbit[2] = get_bit_or_zero(cell->getPort("\\I0"));
|
|
||||||
else if (cell->type == "\\ICE40_CARRY_LUT")
|
|
||||||
inbit[2] = get_bit_or_zero(cell->getPort("\\I2"));
|
|
||||||
else log_abort();
|
|
||||||
for (int i = 0; i < 3; i++)
|
for (int i = 0; i < 3; i++)
|
||||||
if (inbit[i].wire == nullptr) {
|
if (inbit[i].wire == nullptr) {
|
||||||
if (inbit[i] == State::S1)
|
if (inbit[i] == State::S1)
|
||||||
|
@ -83,14 +79,6 @@ static void run_ice40_opts(Module *module)
|
||||||
module->design->scratchpad_set_bool("opt.did_something", true);
|
module->design->scratchpad_set_bool("opt.did_something", true);
|
||||||
log("Optimized away SB_CARRY cell %s.%s: CO=%s\n",
|
log("Optimized away SB_CARRY cell %s.%s: CO=%s\n",
|
||||||
log_id(module), log_id(cell), log_signal(replacement_output));
|
log_id(module), log_id(cell), log_signal(replacement_output));
|
||||||
|
|
||||||
if (cell->type == "\\ICE40_CARRY_LUT")
|
|
||||||
module->addLut(NEW_ID,
|
|
||||||
{ RTLIL::S0, cell->getPort("\\I1"), cell->getPort("\\I2"), cell->getPort("\\CI") },
|
|
||||||
cell->getPort("\\O"),
|
|
||||||
RTLIL::Const("0110_1001_1001_0110"),
|
|
||||||
cell->get_src_attribute());
|
|
||||||
|
|
||||||
module->remove(cell);
|
module->remove(cell);
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
|
|
|
@ -296,7 +296,7 @@ struct SynthIce40Pass : public ScriptPass
|
||||||
run("opt_merge");
|
run("opt_merge");
|
||||||
run(stringf("dff2dffe -unmap-mince %d", min_ce_use));
|
run(stringf("dff2dffe -unmap-mince %d", min_ce_use));
|
||||||
}
|
}
|
||||||
run("techmap -D NO_LUT -D NO_CARRY -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");
|
||||||
|
|
Loading…
Reference in New Issue