mirror of
https://github.com/YosysHQ/yosys
synced 2025-04-07 01:54:10 +00:00
Merge branch 'master' into clifford/pmgen
This commit is contained in:
commit
d0117d7d12
1
Makefile
1
Makefile
|
@ -700,6 +700,7 @@ test: $(TARGETS) $(EXTRA_TARGETS)
|
||||||
+cd tests/various && bash run-test.sh
|
+cd tests/various && bash run-test.sh
|
||||||
+cd tests/sat && bash run-test.sh
|
+cd tests/sat && bash run-test.sh
|
||||||
+cd tests/svinterfaces && bash run-test.sh $(SEEDOPT)
|
+cd tests/svinterfaces && bash run-test.sh $(SEEDOPT)
|
||||||
|
+cd tests/proc && bash run-test.sh
|
||||||
+cd tests/opt && bash run-test.sh
|
+cd tests/opt && bash run-test.sh
|
||||||
+cd tests/aiger && bash run-test.sh $(ABCOPT)
|
+cd tests/aiger && bash run-test.sh $(ABCOPT)
|
||||||
+cd tests/arch && bash run-test.sh
|
+cd tests/arch && bash run-test.sh
|
||||||
|
|
|
@ -451,7 +451,7 @@ void AigerReader::parse_xaiger(const dict<int,IdString> &box_lookup)
|
||||||
uint32_t poNum YS_ATTRIBUTE(unused) = parse_xaiger_literal(f);
|
uint32_t poNum YS_ATTRIBUTE(unused) = parse_xaiger_literal(f);
|
||||||
log_debug("poNum = %u\n", poNum);
|
log_debug("poNum = %u\n", poNum);
|
||||||
uint32_t boxNum = parse_xaiger_literal(f);
|
uint32_t boxNum = parse_xaiger_literal(f);
|
||||||
log_debug("boxNum = %u\n", poNum);
|
log_debug("boxNum = %u\n", boxNum);
|
||||||
for (unsigned i = 0; i < boxNum; i++) {
|
for (unsigned i = 0; i < boxNum; i++) {
|
||||||
f.ignore(2*sizeof(uint32_t));
|
f.ignore(2*sizeof(uint32_t));
|
||||||
uint32_t boxUniqueId = parse_xaiger_literal(f);
|
uint32_t boxUniqueId = parse_xaiger_literal(f);
|
||||||
|
|
|
@ -1502,7 +1502,10 @@ std::string AstModule::derive_common(RTLIL::Design *design, dict<RTLIL::IdString
|
||||||
rewrite_parameter:
|
rewrite_parameter:
|
||||||
para_info += stringf("%s=%s", child->str.c_str(), log_signal(RTLIL::SigSpec(parameters[para_id])));
|
para_info += stringf("%s=%s", child->str.c_str(), log_signal(RTLIL::SigSpec(parameters[para_id])));
|
||||||
delete child->children.at(0);
|
delete child->children.at(0);
|
||||||
if ((parameters[para_id].flags & RTLIL::CONST_FLAG_STRING) != 0)
|
if ((parameters[para_id].flags & RTLIL::CONST_FLAG_REAL) != 0) {
|
||||||
|
child->children[0] = new AstNode(AST_REALVALUE);
|
||||||
|
child->children[0]->realvalue = std::stod(parameters[para_id].decode_string());
|
||||||
|
} else if ((parameters[para_id].flags & RTLIL::CONST_FLAG_STRING) != 0)
|
||||||
child->children[0] = AstNode::mkconst_str(parameters[para_id].decode_string());
|
child->children[0] = AstNode::mkconst_str(parameters[para_id].decode_string());
|
||||||
else
|
else
|
||||||
child->children[0] = AstNode::mkconst_bits(parameters[para_id].bits, (parameters[para_id].flags & RTLIL::CONST_FLAG_SIGNED) != 0);
|
child->children[0] = AstNode::mkconst_bits(parameters[para_id].bits, (parameters[para_id].flags & RTLIL::CONST_FLAG_SIGNED) != 0);
|
||||||
|
|
|
@ -127,7 +127,7 @@ bool mergeable(RTLIL::Cell *a, RTLIL::Cell *b)
|
||||||
|
|
||||||
RTLIL::IdString decode_port_semantics(RTLIL::Cell *cell, RTLIL::IdString port_name)
|
RTLIL::IdString decode_port_semantics(RTLIL::Cell *cell, RTLIL::IdString port_name)
|
||||||
{
|
{
|
||||||
if (cell->type.in(ID($lt), ID($le), ID($ge), ID($gt), ID($div), ID($mod), ID($concat), SHIFT_OPS) && port_name == ID(B))
|
if (cell->type.in(ID($lt), ID($le), ID($ge), ID($gt), ID($div), ID($mod), ID($concat), SHIFT_OPS) && port_name == ID::B)
|
||||||
return port_name;
|
return port_name;
|
||||||
|
|
||||||
return "";
|
return "";
|
||||||
|
@ -135,9 +135,9 @@ RTLIL::IdString decode_port_semantics(RTLIL::Cell *cell, RTLIL::IdString port_na
|
||||||
|
|
||||||
RTLIL::SigSpec decode_port_sign(RTLIL::Cell *cell, RTLIL::IdString port_name) {
|
RTLIL::SigSpec decode_port_sign(RTLIL::Cell *cell, RTLIL::IdString port_name) {
|
||||||
|
|
||||||
if (cell->type == ID($alu) && port_name == ID(B))
|
if (cell->type == ID($alu) && port_name == ID::B)
|
||||||
return cell->getPort(ID(BI));
|
return cell->getPort(ID(BI));
|
||||||
else if (cell->type == ID($sub) && port_name == ID(B))
|
else if (cell->type == ID($sub) && port_name == ID::B)
|
||||||
return RTLIL::Const(1, 1);
|
return RTLIL::Const(1, 1);
|
||||||
|
|
||||||
return RTLIL::Const(0, 1);
|
return RTLIL::Const(0, 1);
|
||||||
|
@ -173,9 +173,9 @@ void merge_operators(RTLIL::Module *module, RTLIL::Cell *mux, const std::vector<
|
||||||
for (const auto& p : ports) {
|
for (const auto& p : ports) {
|
||||||
auto op = p.op;
|
auto op = p.op;
|
||||||
|
|
||||||
RTLIL::IdString muxed_port_name = ID(A);
|
RTLIL::IdString muxed_port_name = ID::A;
|
||||||
if (decode_port(op, ID(A), &assign_map) == operand)
|
if (decode_port(op, ID::A, &assign_map) == operand)
|
||||||
muxed_port_name = ID(B);
|
muxed_port_name = ID::B;
|
||||||
|
|
||||||
auto operand = decode_port(op, muxed_port_name, &assign_map);
|
auto operand = decode_port(op, muxed_port_name, &assign_map);
|
||||||
if (operand.sig.size() > max_width)
|
if (operand.sig.size() > max_width)
|
||||||
|
@ -204,9 +204,9 @@ void merge_operators(RTLIL::Module *module, RTLIL::Cell *mux, const std::vector<
|
||||||
if (muxed_op.sign != muxed_operands[0].sign)
|
if (muxed_op.sign != muxed_operands[0].sign)
|
||||||
muxed_op = ExtSigSpec(module->Neg(NEW_ID, muxed_op.sig, muxed_op.is_signed));
|
muxed_op = ExtSigSpec(module->Neg(NEW_ID, muxed_op.sig, muxed_op.is_signed));
|
||||||
|
|
||||||
RTLIL::SigSpec mux_y = mux->getPort(ID(Y));
|
RTLIL::SigSpec mux_y = mux->getPort(ID::Y);
|
||||||
RTLIL::SigSpec mux_a = mux->getPort(ID(A));
|
RTLIL::SigSpec mux_a = mux->getPort(ID::A);
|
||||||
RTLIL::SigSpec mux_b = mux->getPort(ID(B));
|
RTLIL::SigSpec mux_b = mux->getPort(ID::B);
|
||||||
RTLIL::SigSpec mux_s = mux->getPort(ID(S));
|
RTLIL::SigSpec mux_s = mux->getPort(ID(S));
|
||||||
|
|
||||||
RTLIL::SigSpec shared_pmux_a = RTLIL::Const(RTLIL::State::Sx, max_width);
|
RTLIL::SigSpec shared_pmux_a = RTLIL::Const(RTLIL::State::Sx, max_width);
|
||||||
|
@ -216,24 +216,24 @@ void merge_operators(RTLIL::Module *module, RTLIL::Cell *mux, const std::vector<
|
||||||
int conn_width = ports[0].sig.size();
|
int conn_width = ports[0].sig.size();
|
||||||
int conn_offset = ports[0].mux_port_offset;
|
int conn_offset = ports[0].mux_port_offset;
|
||||||
|
|
||||||
shared_op->setPort(ID(Y), shared_op->getPort(ID(Y)).extract(0, conn_width));
|
shared_op->setPort(ID::Y, shared_op->getPort(ID::Y).extract(0, conn_width));
|
||||||
|
|
||||||
if (mux->type == ID($pmux)) {
|
if (mux->type == ID($pmux)) {
|
||||||
shared_pmux_s = RTLIL::SigSpec();
|
shared_pmux_s = RTLIL::SigSpec();
|
||||||
|
|
||||||
for (const auto &p : ports) {
|
for (const auto &p : ports) {
|
||||||
shared_pmux_s.append(mux_s[p.mux_port_id]);
|
shared_pmux_s.append(mux_s[p.mux_port_id]);
|
||||||
mux_b.replace(p.mux_port_id * mux_a.size() + conn_offset, shared_op->getPort(ID(Y)));
|
mux_b.replace(p.mux_port_id * mux_a.size() + conn_offset, shared_op->getPort(ID::Y));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
shared_pmux_s = RTLIL::SigSpec{mux_s, module->Not(NEW_ID, mux_s)};
|
shared_pmux_s = RTLIL::SigSpec{mux_s, module->Not(NEW_ID, mux_s)};
|
||||||
mux_a.replace(conn_offset, shared_op->getPort(ID(Y)));
|
mux_a.replace(conn_offset, shared_op->getPort(ID::Y));
|
||||||
mux_b.replace(conn_offset, shared_op->getPort(ID(Y)));
|
mux_b.replace(conn_offset, shared_op->getPort(ID::Y));
|
||||||
}
|
}
|
||||||
|
|
||||||
mux->setPort(ID(A), mux_a);
|
mux->setPort(ID::A, mux_a);
|
||||||
mux->setPort(ID(B), mux_b);
|
mux->setPort(ID::B, mux_b);
|
||||||
mux->setPort(ID(Y), mux_y);
|
mux->setPort(ID::Y, mux_y);
|
||||||
mux->setPort(ID(S), mux_s);
|
mux->setPort(ID(S), mux_s);
|
||||||
|
|
||||||
for (const auto &op : muxed_operands)
|
for (const auto &op : muxed_operands)
|
||||||
|
@ -251,11 +251,11 @@ void merge_operators(RTLIL::Module *module, RTLIL::Cell *mux, const std::vector<
|
||||||
|
|
||||||
shared_op->setParam(ID(Y_WIDTH), conn_width);
|
shared_op->setParam(ID(Y_WIDTH), conn_width);
|
||||||
|
|
||||||
if (decode_port(shared_op, ID(A), &assign_map) == operand) {
|
if (decode_port(shared_op, ID::A, &assign_map) == operand) {
|
||||||
shared_op->setPort(ID(B), mux_to_oper);
|
shared_op->setPort(ID::B, mux_to_oper);
|
||||||
shared_op->setParam(ID(B_WIDTH), max_width);
|
shared_op->setParam(ID(B_WIDTH), max_width);
|
||||||
} else {
|
} else {
|
||||||
shared_op->setPort(ID(A), mux_to_oper);
|
shared_op->setPort(ID::A, mux_to_oper);
|
||||||
shared_op->setParam(ID(A_WIDTH), max_width);
|
shared_op->setParam(ID(A_WIDTH), max_width);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -286,9 +286,9 @@ void check_muxed_operands(std::vector<const OpMuxConn *> &ports, const ExtSigSpe
|
||||||
auto p = *it;
|
auto p = *it;
|
||||||
auto op = p->op;
|
auto op = p->op;
|
||||||
|
|
||||||
RTLIL::IdString muxed_port_name = ID(A);
|
RTLIL::IdString muxed_port_name = ID::A;
|
||||||
if (decode_port(op, ID(A), &assign_map) == shared_operand) {
|
if (decode_port(op, ID::A, &assign_map) == shared_operand) {
|
||||||
muxed_port_name = ID(B);
|
muxed_port_name = ID::B;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto operand = decode_port(op, muxed_port_name, &assign_map);
|
auto operand = decode_port(op, muxed_port_name, &assign_map);
|
||||||
|
@ -315,7 +315,7 @@ ExtSigSpec find_shared_operand(const OpMuxConn* seed, std::vector<const OpMuxCon
|
||||||
|
|
||||||
auto op_a = seed->op;
|
auto op_a = seed->op;
|
||||||
|
|
||||||
for (RTLIL::IdString port_name : {ID(A), ID(B)}) {
|
for (RTLIL::IdString port_name : {ID::A, ID::B}) {
|
||||||
oper = decode_port(op_a, port_name, &assign_map);
|
oper = decode_port(op_a, port_name, &assign_map);
|
||||||
auto operand_users = operand_to_users.at(oper);
|
auto operand_users = operand_to_users.at(oper);
|
||||||
|
|
||||||
|
@ -355,7 +355,7 @@ dict<RTLIL::SigSpec, OpMuxConn> find_valid_op_mux_conns(RTLIL::Module *module, d
|
||||||
std::function<void(RTLIL::SigBit)> remove_outsig_from_aux_bit = [&](RTLIL::SigBit auxbit) {
|
std::function<void(RTLIL::SigBit)> remove_outsig_from_aux_bit = [&](RTLIL::SigBit auxbit) {
|
||||||
auto aux_outsig = op_aux_to_outsig.at(auxbit);
|
auto aux_outsig = op_aux_to_outsig.at(auxbit);
|
||||||
auto op = outsig_to_operator.at(aux_outsig);
|
auto op = outsig_to_operator.at(aux_outsig);
|
||||||
auto op_outsig = assign_map(op->getPort(ID(Y)));
|
auto op_outsig = assign_map(op->getPort(ID::Y));
|
||||||
remove_outsig(op_outsig);
|
remove_outsig(op_outsig);
|
||||||
|
|
||||||
for (auto aux_outbit : aux_outsig)
|
for (auto aux_outbit : aux_outsig)
|
||||||
|
@ -367,11 +367,11 @@ dict<RTLIL::SigSpec, OpMuxConn> find_valid_op_mux_conns(RTLIL::Module *module, d
|
||||||
int mux_port_size;
|
int mux_port_size;
|
||||||
|
|
||||||
if (mux->type.in(ID($mux), ID($_MUX_))) {
|
if (mux->type.in(ID($mux), ID($_MUX_))) {
|
||||||
mux_port_size = mux->getPort(ID(A)).size();
|
mux_port_size = mux->getPort(ID::A).size();
|
||||||
sig = RTLIL::SigSpec{mux->getPort(ID(B)), mux->getPort(ID(A))};
|
sig = RTLIL::SigSpec{mux->getPort(ID::B), mux->getPort(ID::A)};
|
||||||
} else {
|
} else {
|
||||||
mux_port_size = mux->getPort(ID(A)).size();
|
mux_port_size = mux->getPort(ID::A).size();
|
||||||
sig = mux->getPort(ID(B));
|
sig = mux->getPort(ID::B);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto mux_insig = assign_map(sig);
|
auto mux_insig = assign_map(sig);
|
||||||
|
@ -510,12 +510,12 @@ struct OptSharePass : public Pass {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
auto mux_insig = assign_map(cell->getPort(ID(Y)));
|
auto mux_insig = assign_map(cell->getPort(ID::Y));
|
||||||
outsig_to_operator[mux_insig] = cell;
|
outsig_to_operator[mux_insig] = cell;
|
||||||
for (auto outbit : mux_insig)
|
for (auto outbit : mux_insig)
|
||||||
op_outbit_to_outsig[outbit] = mux_insig;
|
op_outbit_to_outsig[outbit] = mux_insig;
|
||||||
|
|
||||||
for (RTLIL::IdString port_name : {ID(A), ID(B)}) {
|
for (RTLIL::IdString port_name : {ID::A, ID::B}) {
|
||||||
auto op_insig = decode_port(cell, port_name, &assign_map);
|
auto op_insig = decode_port(cell, port_name, &assign_map);
|
||||||
op_insigs.push_back(op_insig);
|
op_insigs.push_back(op_insig);
|
||||||
operand_to_users[op_insig].insert(cell);
|
operand_to_users[op_insig].insert(cell);
|
||||||
|
|
4
passes/pmgen/.gitignore
vendored
4
passes/pmgen/.gitignore
vendored
|
@ -1,3 +1 @@
|
||||||
/test_pmgen_pm.h
|
/*_pm.h
|
||||||
/ice40_dsp_pm.h
|
|
||||||
/peepopt_pm.h
|
|
|
@ -69,8 +69,7 @@ void proc_clean_switch(RTLIL::SwitchRule *sw, RTLIL::CaseRule *parent, bool &did
|
||||||
did_something = true;
|
did_something = true;
|
||||||
for (auto &action : sw->cases[0]->actions)
|
for (auto &action : sw->cases[0]->actions)
|
||||||
parent->actions.push_back(action);
|
parent->actions.push_back(action);
|
||||||
for (auto sw2 : sw->cases[0]->switches)
|
parent->switches.insert(parent->switches.begin(), sw->cases[0]->switches.begin(), sw->cases[0]->switches.end());
|
||||||
parent->switches.push_back(sw2);
|
|
||||||
sw->cases[0]->switches.clear();
|
sw->cases[0]->switches.clear();
|
||||||
delete sw->cases[0];
|
delete sw->cases[0];
|
||||||
sw->cases.clear();
|
sw->cases.clear();
|
||||||
|
|
|
@ -265,7 +265,7 @@ struct Dff2dffePass : public Pass {
|
||||||
log("\n");
|
log("\n");
|
||||||
log(" -unmap\n");
|
log(" -unmap\n");
|
||||||
log(" operate in the opposite direction: replace $dffe cells with combinations\n");
|
log(" operate in the opposite direction: replace $dffe cells with combinations\n");
|
||||||
log(" of $dff and $mux cells. the options below are ignore in unmap mode.\n");
|
log(" of $dff and $mux cells. the options below are ignored in unmap mode.\n");
|
||||||
log("\n");
|
log("\n");
|
||||||
log(" -unmap-mince N\n");
|
log(" -unmap-mince N\n");
|
||||||
log(" Same as -unmap but only unmap $dffe where the clock enable port\n");
|
log(" Same as -unmap but only unmap $dffe where the clock enable port\n");
|
||||||
|
|
1
tests/proc/.gitignore
vendored
Normal file
1
tests/proc/.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
*.log
|
23
tests/proc/bug_1268.v
Normal file
23
tests/proc/bug_1268.v
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
module gold (input clock, ctrl, din, output reg dout);
|
||||||
|
always @(posedge clock) begin
|
||||||
|
if (1'b1) begin
|
||||||
|
if (1'b0) begin end else begin
|
||||||
|
dout <= 0;
|
||||||
|
end
|
||||||
|
if (ctrl)
|
||||||
|
dout <= din;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
module gate (input clock, ctrl, din, output reg dout);
|
||||||
|
always @(posedge clock) begin
|
||||||
|
if (1'b1) begin
|
||||||
|
if (1'b0) begin end else begin
|
||||||
|
dout <= 0;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if (ctrl)
|
||||||
|
dout <= din;
|
||||||
|
end
|
||||||
|
endmodule
|
5
tests/proc/bug_1268.ys
Normal file
5
tests/proc/bug_1268.ys
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
read_verilog bug_1268.v
|
||||||
|
proc
|
||||||
|
equiv_make gold gate equiv
|
||||||
|
equiv_induct
|
||||||
|
equiv_status -assert
|
6
tests/proc/run-test.sh
Executable file
6
tests/proc/run-test.sh
Executable file
|
@ -0,0 +1,6 @@
|
||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
for x in *.ys; do
|
||||||
|
echo "Running $x.."
|
||||||
|
../../yosys -ql ${x%.ys}.log $x
|
||||||
|
done
|
|
@ -1,4 +1,3 @@
|
||||||
|
|
||||||
module demo_001(y1, y2, y3, y4);
|
module demo_001(y1, y2, y3, y4);
|
||||||
output [7:0] y1, y2, y3, y4;
|
output [7:0] y1, y2, y3, y4;
|
||||||
|
|
||||||
|
@ -22,3 +21,13 @@ module demo_002(y0, y1, y2, y3);
|
||||||
assign y3 = 1 ? -1 : 'd0;
|
assign y3 = 1 ? -1 : 'd0;
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
|
module demo_003(output A, B);
|
||||||
|
parameter real p = 0;
|
||||||
|
assign A = (p==1.0);
|
||||||
|
assign B = (p!="1.000000");
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
module demo_004(output A, B, C, D);
|
||||||
|
demo_003 #(1.0) demo_real (A, B);
|
||||||
|
demo_003 #(1) demo_int (C, D);
|
||||||
|
endmodule
|
||||||
|
|
1
tests/simple_abc9/.gitignore
vendored
1
tests/simple_abc9/.gitignore
vendored
|
@ -1,3 +1,4 @@
|
||||||
*.v
|
*.v
|
||||||
|
*.sv
|
||||||
*.log
|
*.log
|
||||||
*.out
|
*.out
|
||||||
|
|
Loading…
Reference in a new issue