aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG1
-rw-r--r--backends/verilog/verilog_backend.cc5
-rw-r--r--passes/opt/wreduce.cc2
-rw-r--r--passes/sat/clk2fflogic.cc7
-rw-r--r--techlibs/common/synth.cc15
-rw-r--r--techlibs/ecp5/synth_ecp5.cc2
-rw-r--r--tests/simple_abc9/.gitignore3
-rw-r--r--tests/various/async.sh11
-rw-r--r--tests/various/async.v108
-rwxr-xr-xtests/various/run-test.sh14
10 files changed, 141 insertions, 27 deletions
diff --git a/CHANGELOG b/CHANGELOG
index 33b34a6ff..44d83c1bf 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -12,7 +12,6 @@ Yosys 0.9 .. Yosys 0.9-dev
- Added "synth_xilinx -abc9" (experimental)
- Added "synth_ice40 -abc9" (experimental)
- Added "synth -abc9" (experimental)
- - Added "synth -keepdc"
- Added "script -scriptwire
- "synth_xilinx" to now infer wide multiplexers (-widemux <min> to enable)
diff --git a/backends/verilog/verilog_backend.cc b/backends/verilog/verilog_backend.cc
index 6288502a5..087c6fec6 100644
--- a/backends/verilog/verilog_backend.cc
+++ b/backends/verilog/verilog_backend.cc
@@ -1501,6 +1501,7 @@ void dump_proc_switch(std::ostream &f, std::string indent, RTLIL::SwitchRule *sw
bool got_default = false;
for (auto it = sw->cases.begin(); it != sw->cases.end(); ++it) {
+ dump_attributes(f, indent + " ", (*it)->attributes, '\n', /*modattr=*/false, /*as_comment=*/true);
if ((*it)->compare.size() == 0) {
if (got_default)
continue;
@@ -1514,9 +1515,7 @@ void dump_proc_switch(std::ostream &f, std::string indent, RTLIL::SwitchRule *sw
dump_sigspec(f, (*it)->compare[i]);
}
}
- f << stringf(":");
- dump_attributes(f, indent, (*it)->attributes, ' ', /*modattr=*/false, /*as_comment=*/true);
- f << stringf("\n");
+ f << stringf(":\n");
dump_case_body(f, indent + " ", *it);
}
diff --git a/passes/opt/wreduce.cc b/passes/opt/wreduce.cc
index f749c8249..1fbc41082 100644
--- a/passes/opt/wreduce.cc
+++ b/passes/opt/wreduce.cc
@@ -497,7 +497,7 @@ struct WreducePass : public Pass {
log(" flows that use the 'memory_memx' pass.\n");
log("\n");
log(" -keepdc\n");
- log(" Do not optimize explicit don't-care values on $mux cells.\n");
+ log(" Do not optimize explicit don't-care values.\n");
log("\n");
}
void execute(std::vector<std::string> args, Design *design) YS_OVERRIDE
diff --git a/passes/sat/clk2fflogic.cc b/passes/sat/clk2fflogic.cc
index 49ec795d3..4bb4aa047 100644
--- a/passes/sat/clk2fflogic.cc
+++ b/passes/sat/clk2fflogic.cc
@@ -253,6 +253,13 @@ struct Clk2fflogicPass : public Pass {
SigSpec qval = module->Mux(NEW_ID, past_q, past_d, clock_edge);
Const rstval = cell->parameters["\\ARST_VALUE"];
+ Wire *past_arst = module->addWire(NEW_ID);
+ module->addFf(NEW_ID, arst, past_arst);
+ if (cell->parameters["\\ARST_POLARITY"].as_bool())
+ arst = module->LogicOr(NEW_ID, arst, past_arst);
+ else
+ arst = module->LogicAnd(NEW_ID, arst, past_arst);
+
if (cell->parameters["\\ARST_POLARITY"].as_bool())
module->addMux(NEW_ID, qval, rstval, arst, sig_q);
else
diff --git a/techlibs/common/synth.cc b/techlibs/common/synth.cc
index af70cc498..555de9fba 100644
--- a/techlibs/common/synth.cc
+++ b/techlibs/common/synth.cc
@@ -78,9 +78,6 @@ struct SynthPass : public ScriptPass
log(" -abc9\n");
log(" use new ABC9 flow (EXPERIMENTAL)\n");
log("\n");
- log(" -keepdc\n");
- log(" do not optimize explicit don't-care values on $mux cells.\n");
- log("\n");
log("\n");
log("The following commands are executed by this synthesis command:\n");
help_script();
@@ -88,7 +85,7 @@ struct SynthPass : public ScriptPass
}
string top_module, fsm_opts, memory_opts, abc;
- bool autotop, flatten, noalumacc, nofsm, noabc, noshare, keepdc;
+ bool autotop, flatten, noalumacc, nofsm, noabc, noshare;
int lut;
void clear_flags() YS_OVERRIDE
@@ -105,7 +102,6 @@ struct SynthPass : public ScriptPass
noabc = false;
noshare = false;
abc = "abc";
- keepdc = false;
}
void execute(std::vector<std::string> args, RTLIL::Design *design) YS_OVERRIDE
@@ -171,10 +167,6 @@ struct SynthPass : public ScriptPass
abc = "abc9";
continue;
}
- if (args[argidx] == "-keepdc") {
- keepdc = true;
- continue;
- }
break;
}
extra_args(args, argidx, design);
@@ -219,10 +211,7 @@ struct SynthPass : public ScriptPass
run("opt_clean");
run("check");
run("opt");
- if (help_mode)
- run("wreduce [-keepdc]");
- else
- run("wreduce" + std::string(keepdc ? " -keepdc" : ""));
+ run("wreduce");
run("peepopt");
run("opt_clean");
if (help_mode)
diff --git a/techlibs/ecp5/synth_ecp5.cc b/techlibs/ecp5/synth_ecp5.cc
index f16a47f01..3b0c2ea9e 100644
--- a/techlibs/ecp5/synth_ecp5.cc
+++ b/techlibs/ecp5/synth_ecp5.cc
@@ -2,7 +2,7 @@
* yosys -- Yosys Open SYnthesis Suite
*
* Copyright (C) 2012 Clifford Wolf <clifford@clifford.at>
- * Copyright (C) 2018 Clifford Wolf <dave@ds0.me>
+ * Copyright (C) 2018 David Shah <dave@ds0.me>
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
diff --git a/tests/simple_abc9/.gitignore b/tests/simple_abc9/.gitignore
new file mode 100644
index 000000000..598951333
--- /dev/null
+++ b/tests/simple_abc9/.gitignore
@@ -0,0 +1,3 @@
+*.v
+*.log
+*.out
diff --git a/tests/various/async.sh b/tests/various/async.sh
new file mode 100644
index 000000000..7c41d6d94
--- /dev/null
+++ b/tests/various/async.sh
@@ -0,0 +1,11 @@
+#!/bin/bash
+set -ex
+../../yosys -q -o async_syn.v -p 'synth; rename uut syn' async.v
+../../yosys -q -o async_prp.v -p 'prep; rename uut prp' async.v
+../../yosys -q -o async_a2s.v -p 'prep; async2sync; rename uut a2s' async.v
+../../yosys -q -o async_ffl.v -p 'prep; clk2fflogic; rename uut ffl' async.v
+iverilog -o async_sim -DTESTBENCH async.v async_???.v
+vvp -N async_sim > async.out
+tail async.out
+grep PASS async.out
+rm -f async_???.v async_sim async.out async.vcd
diff --git a/tests/various/async.v b/tests/various/async.v
new file mode 100644
index 000000000..c27e30c4b
--- /dev/null
+++ b/tests/various/async.v
@@ -0,0 +1,108 @@
+`define MAXQ 2
+module uut (
+ input clk,
+ input d, r, e,
+ output [`MAXQ:0] q
+);
+ reg q0;
+ always @(posedge clk) begin
+ if (r)
+ q0 <= 0;
+ else if (e)
+ q0 <= d;
+ end
+
+ reg q1;
+ always @(posedge clk, posedge r) begin
+ if (r)
+ q1 <= 0;
+ else if (e)
+ q1 <= d;
+ end
+
+ reg q2;
+ always @(posedge clk, negedge r) begin
+ if (!r)
+ q2 <= 0;
+ else if (!e)
+ q2 <= d;
+ end
+
+ assign q = {q2, q1, q0};
+endmodule
+
+`ifdef TESTBENCH
+module \$ff #(
+ parameter integer WIDTH = 1
+) (
+ input [WIDTH-1:0] D,
+ output reg [WIDTH-1:0] Q
+);
+ wire sysclk = testbench.sysclk;
+ always @(posedge sysclk)
+ Q <= D;
+endmodule
+
+module testbench;
+ reg sysclk;
+ always #5 sysclk = (sysclk === 1'b0);
+
+ reg clk;
+ always @(posedge sysclk) clk = (clk === 1'b0);
+
+ reg d, r, e;
+
+ wire [`MAXQ:0] q_uut;
+ uut uut (.clk(clk), .d(d), .r(r), .e(e), .q(q_uut));
+
+ wire [`MAXQ:0] q_syn;
+ syn syn (.clk(clk), .d(d), .r(r), .e(e), .q(q_syn));
+
+ wire [`MAXQ:0] q_prp;
+ prp prp (.clk(clk), .d(d), .r(r), .e(e), .q(q_prp));
+
+ wire [`MAXQ:0] q_a2s;
+ a2s a2s (.clk(clk), .d(d), .r(r), .e(e), .q(q_a2s));
+
+ wire [`MAXQ:0] q_ffl;
+ ffl ffl (.clk(clk), .d(d), .r(r), .e(e), .q(q_ffl));
+
+ task printq;
+ reg [5*8-1:0] msg;
+ begin
+ msg = "OK";
+ if (q_uut !== q_syn) msg = "SYN";
+ if (q_uut !== q_prp) msg = "PRP";
+ if (q_uut !== q_a2s) msg = "A2S";
+ if (q_uut !== q_ffl) msg = "FFL";
+ $display("%6t %b %b %b %b %b %s", $time, q_uut, q_syn, q_prp, q_a2s, q_ffl, msg);
+ if (msg != "OK") $finish;
+ end
+ endtask
+
+ initial if(0) begin
+ $dumpfile("async.vcd");
+ $dumpvars(0, testbench);
+ end
+
+ initial begin
+ @(posedge clk);
+ d <= 0;
+ r <= 0;
+ e <= 0;
+ @(posedge clk);
+ e <= 1;
+ @(posedge clk);
+ e <= 0;
+ repeat (10000) begin
+ @(posedge clk);
+ printq;
+ d <= $random;
+ r <= $random;
+ e <= $random;
+ end
+ $display("PASS");
+ $finish;
+ end
+endmodule
+`endif
diff --git a/tests/various/run-test.sh b/tests/various/run-test.sh
index d49553ede..92b905765 100755
--- a/tests/various/run-test.sh
+++ b/tests/various/run-test.sh
@@ -4,11 +4,9 @@ for x in *.ys; do
echo "Running $x.."
../../yosys -ql ${x%.ys}.log $x
done
-# Run any .sh files in this directory (with the exception of the file - run-test.sh
-shell_tests=$(echo *.sh | sed -e 's/run-test.sh//')
-if [ "$shell_tests" ]; then
- for s in $shell_tests; do
- echo "Running $s.."
- bash $s
- done
-fi
+for s in *.sh; do
+ if [ "$s" != "run-test.sh" ]; then
+ echo "Running $s.."
+ bash $s
+ fi
+done