Merge remote-tracking branch 'origin/xaig' into xc7mux

This commit is contained in:
Eddie Hung 2019-06-26 20:07:31 -07:00
commit dbb8c8caaa
7 changed files with 56 additions and 47 deletions

View File

@ -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)

View File

@ -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);

View File

@ -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;
} }
} }

View File

@ -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

View File

@ -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,

View File

@ -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

View File

@ -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,