mirror of https://github.com/YosysHQ/yosys.git
Merge remote-tracking branch 'origin/xaig' into xc7mux
This commit is contained in:
commit
dbb8c8caaa
|
@ -22,6 +22,7 @@ Yosys 0.8 .. Yosys 0.8-dev
|
||||||
- Added "muxcover -dmux=<cost>"
|
- Added "muxcover -dmux=<cost>"
|
||||||
- Added "muxcover -nopartial"
|
- Added "muxcover -nopartial"
|
||||||
- Added "muxpack" pass
|
- Added "muxpack" pass
|
||||||
|
- Added "write_xaiger" backend
|
||||||
- Added "abc9" pass for timing-aware techmapping (experimental, FPGA only, no FFs)
|
- Added "abc9" pass for timing-aware techmapping (experimental, FPGA only, no FFs)
|
||||||
- Added "synth_xilinx -abc9" (experimental)
|
- Added "synth_xilinx -abc9" (experimental)
|
||||||
- Added "synth_ice40 -abc9" (experimental)
|
- Added "synth_ice40 -abc9" (experimental)
|
||||||
|
|
|
@ -293,10 +293,12 @@ struct XAigerWriter
|
||||||
#if 0
|
#if 0
|
||||||
unsigned i = 0;
|
unsigned i = 0;
|
||||||
for (auto &it : toposort.loops) {
|
for (auto &it : toposort.loops) {
|
||||||
log(" loop %d", i++);
|
log(" loop %d\n", i++);
|
||||||
for (auto cell : it)
|
for (auto cell_name : it) {
|
||||||
log(" %s", log_id(cell));
|
auto cell = module->cell(cell_name);
|
||||||
log("\n");
|
log_assert(cell);
|
||||||
|
log("\t%s (%s @ %s)\n", log_id(cell), log_id(cell->type), cell->get_src_attribute().c_str());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
log_assert(no_loops);
|
log_assert(no_loops);
|
||||||
|
|
|
@ -80,6 +80,8 @@ void handle_loops(RTLIL::Design *design)
|
||||||
{
|
{
|
||||||
Pass::call(design, "scc -set_attr abc_scc_id {}");
|
Pass::call(design, "scc -set_attr abc_scc_id {}");
|
||||||
|
|
||||||
|
dict<IdString, vector<IdString>> module_break;
|
||||||
|
|
||||||
// For every unique SCC found, (arbitrarily) find the first
|
// For every unique SCC found, (arbitrarily) find the first
|
||||||
// cell in the component, and select (and mark) all its output
|
// cell in the component, and select (and mark) all its output
|
||||||
// wires
|
// wires
|
||||||
|
@ -113,43 +115,45 @@ void handle_loops(RTLIL::Design *design)
|
||||||
}
|
}
|
||||||
cell->attributes.erase(it);
|
cell->attributes.erase(it);
|
||||||
}
|
}
|
||||||
RTLIL::Module* box_module = design->module(cell->type);
|
|
||||||
if (box_module) {
|
auto jt = module_break.find(cell->type);
|
||||||
auto jt = box_module->attributes.find("\\abc_scc_break");
|
if (jt == module_break.end()) {
|
||||||
if (jt != box_module->attributes.end()) {
|
std::vector<IdString> ports;
|
||||||
auto it = cell->connections_.find(RTLIL::escape_id(jt->second.decode_string()));
|
if (!yosys_celltypes.cell_known(cell->type)) {
|
||||||
if (it == cell->connections_.end())
|
RTLIL::Module* box_module = design->module(cell->type);
|
||||||
log_error("abc_scc_break attribute value '%s' does not exist as port on module '%s'\n", jt->second.decode_string().c_str(), log_id(box_module));
|
log_assert(box_module);
|
||||||
log_assert(it != cell->connections_.end());
|
auto ports_csv = box_module->attributes.at("\\abc_scc_break", RTLIL::Const::from_string("")).decode_string();
|
||||||
RTLIL::SigSpec sig;
|
for (const auto &port_name : split_tokens(ports_csv, ",")) {
|
||||||
for (auto b : it->second) {
|
auto port_id = RTLIL::escape_id(port_name);
|
||||||
Wire *w = b.wire;
|
auto kt = cell->connections_.find(port_id);
|
||||||
if (!w) continue;
|
if (kt == cell->connections_.end())
|
||||||
if (w->port_output) {
|
log_error("abc_scc_break attribute value '%s' does not exist as port on module '%s'\n", port_name.c_str(), log_id(box_module));
|
||||||
log_assert(w->get_bool_attribute("\\abc_scc_break"));
|
ports.push_back(port_id);
|
||||||
w = module->wire(stringf("%s.abci", w->name.c_str()));
|
|
||||||
log_assert(w);
|
|
||||||
log_assert(b.offset < GetSize(w));
|
|
||||||
log_assert(w->port_input);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
log_assert(!w->port_output);
|
|
||||||
w->port_output = true;
|
|
||||||
w->set_bool_attribute("\\abc_scc_break");
|
|
||||||
w = module->wire(stringf("%s.abci", w->name.c_str()));
|
|
||||||
if (!w) {
|
|
||||||
w = module->addWire(stringf("%s.abci", b.wire->name.c_str()), GetSize(b.wire));
|
|
||||||
w->port_input = true;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
log_assert(w->port_input);
|
|
||||||
log_assert(b.offset < GetSize(w));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
sig.append(RTLIL::SigBit(w, b.offset));
|
|
||||||
}
|
}
|
||||||
it->second = sig;
|
|
||||||
}
|
}
|
||||||
|
jt = module_break.insert(std::make_pair(cell->type, std::move(ports))).first;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto port_name : jt->second) {
|
||||||
|
RTLIL::SigSpec sig;
|
||||||
|
auto &rhs = cell->connections_.at(port_name);
|
||||||
|
for (auto b : rhs) {
|
||||||
|
Wire *w = b.wire;
|
||||||
|
if (!w) continue;
|
||||||
|
w->port_output = true;
|
||||||
|
w->set_bool_attribute("\\abc_scc_break");
|
||||||
|
w = module->wire(stringf("%s.abci", w->name.c_str()));
|
||||||
|
if (!w) {
|
||||||
|
w = module->addWire(stringf("%s.abci", b.wire->name.c_str()), GetSize(b.wire));
|
||||||
|
w->port_input = true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
log_assert(b.offset < GetSize(w));
|
||||||
|
log_assert(w->port_input);
|
||||||
|
}
|
||||||
|
sig.append(RTLIL::SigBit(w, b.offset));
|
||||||
|
}
|
||||||
|
rhs = sig;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,8 +4,9 @@
|
||||||
# Box 1 : CCU2C (2xCARRY + 2xLUT4)
|
# Box 1 : CCU2C (2xCARRY + 2xLUT4)
|
||||||
# Outputs: S0, S1, COUT
|
# Outputs: S0, S1, COUT
|
||||||
# (NB: carry chain input/output must be last
|
# (NB: carry chain input/output must be last
|
||||||
# input/output and have been moved there
|
# input/output and bus has been moved
|
||||||
# overriding the alphabetical ordering)
|
# there overriding the otherwise
|
||||||
|
# alphabetical ordering)
|
||||||
# name ID w/b ins outs
|
# name ID w/b ins outs
|
||||||
CCU2C 1 1 9 3
|
CCU2C 1 1 9 3
|
||||||
|
|
||||||
|
|
|
@ -106,7 +106,7 @@ module PFUMX (input ALUT, BLUT, C0, output Z);
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
// ---------------------------------------
|
// ---------------------------------------
|
||||||
(* abc_box_id=2, abc_scc_break="DI" *)
|
(* abc_box_id=2, abc_scc_break="DI,WRE" *)
|
||||||
module TRELLIS_DPR16X4 (
|
module TRELLIS_DPR16X4 (
|
||||||
input [3:0] DI,
|
input [3:0] DI,
|
||||||
input [3:0] WAD,
|
input [3:0] WAD,
|
||||||
|
|
|
@ -23,8 +23,9 @@ MUXF78 3 1 6 1
|
||||||
# Inputs: CYINIT DI0 DI1 DI2 DI3 S0 S1 S2 S3 CI
|
# Inputs: CYINIT DI0 DI1 DI2 DI3 S0 S1 S2 S3 CI
|
||||||
# Outputs: O0 O1 O2 O3 CO0 CO1 CO2 CO3
|
# Outputs: O0 O1 O2 O3 CO0 CO1 CO2 CO3
|
||||||
# (NB: carry chain input/output must be last
|
# (NB: carry chain input/output must be last
|
||||||
# input/output and have been moved there
|
# input/output and the entire bus has been
|
||||||
# overriding the alphabetical ordering)
|
# moved there overriding the otherwise
|
||||||
|
# alphabetical ordering)
|
||||||
CARRY4 4 1 10 8
|
CARRY4 4 1 10 8
|
||||||
482 - - - - 223 - - - 222
|
482 - - - - 223 - - - 222
|
||||||
598 407 - - - 400 205 - - 334
|
598 407 - - - 400 205 - - 334
|
||||||
|
|
|
@ -289,7 +289,7 @@ module FDPE_1 (output reg Q, input C, CE, D, PRE);
|
||||||
always @(negedge C, posedge PRE) if (PRE) Q <= 1'b1; else if (CE) Q <= D;
|
always @(negedge C, posedge PRE) if (PRE) Q <= 1'b1; else if (CE) Q <= D;
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
(* abc_box_id = 5, abc_scc_break="D" *)
|
(* abc_box_id = 5, abc_scc_break="D,WE" *)
|
||||||
module RAM32X1D (
|
module RAM32X1D (
|
||||||
output DPO, SPO,
|
output DPO, SPO,
|
||||||
input D, WCLK, WE,
|
input D, WCLK, WE,
|
||||||
|
@ -307,7 +307,7 @@ module RAM32X1D (
|
||||||
always @(posedge clk) if (WE) mem[a] <= D;
|
always @(posedge clk) if (WE) mem[a] <= D;
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
(* abc_box_id = 6, abc_scc_break="D" *)
|
(* abc_box_id = 6, abc_scc_break="D,WE" *)
|
||||||
module RAM64X1D (
|
module RAM64X1D (
|
||||||
output DPO, SPO,
|
output DPO, SPO,
|
||||||
input D, WCLK, WE,
|
input D, WCLK, WE,
|
||||||
|
@ -325,7 +325,7 @@ module RAM64X1D (
|
||||||
always @(posedge clk) if (WE) mem[a] <= D;
|
always @(posedge clk) if (WE) mem[a] <= D;
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
(* abc_box_id = 7, abc_scc_break="D" *)
|
(* abc_box_id = 7, abc_scc_break="D,WE" *)
|
||||||
module RAM128X1D (
|
module RAM128X1D (
|
||||||
output DPO, SPO,
|
output DPO, SPO,
|
||||||
input D, WCLK, WE,
|
input D, WCLK, WE,
|
||||||
|
|
Loading…
Reference in New Issue