diff options
author | Ruben Undheim <ruben.undheim@gmail.com> | 2016-11-03 23:18:00 +0100 |
---|---|---|
committer | Ruben Undheim <ruben.undheim@gmail.com> | 2016-11-03 23:18:00 +0100 |
commit | fefe0fc0430f4f173a25e674708aa0f4f0854b31 (patch) | |
tree | adb13b830212c269d58031f900d652f29013d2d7 /techlibs | |
parent | 4f096fe65b77435daba019248273e547fa18d167 (diff) |
Imported yosys 0.7
Diffstat (limited to 'techlibs')
-rw-r--r-- | techlibs/common/prep.cc | 16 | ||||
-rw-r--r-- | techlibs/common/simcells.v | 17 | ||||
-rw-r--r-- | techlibs/common/simlib.v | 29 | ||||
-rw-r--r-- | techlibs/common/techmap.v | 2 | ||||
-rw-r--r-- | techlibs/gowin/Makefile.inc | 6 | ||||
-rw-r--r-- | techlibs/gowin/cells_map.v | 31 | ||||
-rw-r--r-- | techlibs/gowin/cells_sim.v | 51 | ||||
-rw-r--r-- | techlibs/gowin/synth_gowin.cc | 178 | ||||
-rw-r--r-- | techlibs/greenpak4/cells_sim.v | 39 | ||||
-rw-r--r-- | techlibs/ice40/synth_ice40.cc | 2 |
10 files changed, 361 insertions, 10 deletions
diff --git a/techlibs/common/prep.cc b/techlibs/common/prep.cc index fac6c4ba..71534983 100644 --- a/techlibs/common/prep.cc +++ b/techlibs/common/prep.cc @@ -63,6 +63,9 @@ struct PrepPass : public ScriptPass log(" -nordff\n"); log(" passed to 'memory_dff'. prohibits merging of FFs into memory read ports\n"); log("\n"); + log(" -nokeepdc\n"); + log(" do not call opt_* with -keepdc\n"); + log("\n"); log(" -run <from_label>[:<to_label>]\n"); log(" only run the commands between the labels (see below). an empty\n"); log(" from label is synonymous to 'begin', and empty to label is\n"); @@ -75,7 +78,7 @@ struct PrepPass : public ScriptPass } string top_module, fsm_opts, memory_opts; - bool autotop, flatten, ifxmode, memxmode, nomemmode; + bool autotop, flatten, ifxmode, memxmode, nomemmode, nokeepdc; virtual void clear_flags() YS_OVERRIDE { @@ -87,6 +90,7 @@ struct PrepPass : public ScriptPass ifxmode = false; memxmode = false; nomemmode = false; + nokeepdc = false; } virtual void execute(std::vector<std::string> args, RTLIL::Design *design) YS_OVERRIDE @@ -136,6 +140,10 @@ struct PrepPass : public ScriptPass memory_opts += " -nordff"; continue; } + if (args[argidx] == "-nokeepdc") { + nokeepdc = true; + continue; + } break; } extra_args(args, argidx, design); @@ -177,10 +185,10 @@ struct PrepPass : public ScriptPass run(ifxmode ? "proc -ifx" : "proc"); if (help_mode || flatten) run("flatten", "(if -flatten)"); - run("opt_expr -keepdc"); + run(nokeepdc ? "opt_expr" : "opt_expr -keepdc"); run("opt_clean"); run("check"); - run("opt -keepdc"); + run(nokeepdc ? "opt" : "opt -keepdc"); if (!ifxmode) { if (help_mode) run("wreduce [-memx]"); @@ -194,7 +202,7 @@ struct PrepPass : public ScriptPass run("opt_clean"); run("memory_collect"); } - run("opt -keepdc -fast"); + run(nokeepdc ? "opt -fast" : "opt -keepdc -fast"); } if (check_label("check")) diff --git a/techlibs/common/simcells.v b/techlibs/common/simcells.v index c4f170a3..e770c545 100644 --- a/techlibs/common/simcells.v +++ b/techlibs/common/simcells.v @@ -495,6 +495,23 @@ always @(posedge S, posedge R) begin end endmodule +`ifdef SIMCELLS_FF +// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| +//- +//- $_FF_ (D, Q) +//- +//- A D-type flip-flop that is clocked from the implicit global clock. (This cell +//- type is usually only used in netlists for formal verification.) +//- +module \$_FF_ (D, Q); +input D; +output reg Q; +always @($global_clock) begin + Q <= D; +end +endmodule +`endif + // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| //- //- $_DFF_N_ (D, C, Q) diff --git a/techlibs/common/simlib.v b/techlibs/common/simlib.v index 922a47ca..2c4db1ac 100644 --- a/techlibs/common/simlib.v +++ b/techlibs/common/simlib.v @@ -1334,6 +1334,18 @@ endmodule // -------------------------------------------------------- +module \$anyseq (Y); + +parameter WIDTH = 0; + +output [WIDTH-1:0] Y; + +assign Y = 'bx; + +endmodule + +// -------------------------------------------------------- + module \$equiv (A, B, Y); input A, B; @@ -1382,6 +1394,23 @@ endmodule `endif // -------------------------------------------------------- +`ifdef SIMLIB_FF + +module \$ff (D, Q); + +parameter WIDTH = 0; + +input [WIDTH-1:0] D; +output reg [WIDTH-1:0] Q; + +always @($global_clk) begin + Q <= D; +end + +endmodule + +`endif +// -------------------------------------------------------- module \$dff (CLK, D, Q); diff --git a/techlibs/common/techmap.v b/techlibs/common/techmap.v index 90c4ed7e..d7ec3947 100644 --- a/techlibs/common/techmap.v +++ b/techlibs/common/techmap.v @@ -64,7 +64,7 @@ module _90_simplemap_various; endmodule (* techmap_simplemap *) -(* techmap_celltype = "$sr $dff $dffe $adff $dffsr $dlatch" *) +(* techmap_celltype = "$sr $ff $dff $dffe $adff $dffsr $dlatch" *) module _90_simplemap_registers; endmodule diff --git a/techlibs/gowin/Makefile.inc b/techlibs/gowin/Makefile.inc new file mode 100644 index 00000000..679d7eff --- /dev/null +++ b/techlibs/gowin/Makefile.inc @@ -0,0 +1,6 @@ + +OBJS += techlibs/gowin/synth_gowin.o + +$(eval $(call add_share_file,share/gowin,techlibs/gowin/cells_map.v)) +$(eval $(call add_share_file,share/gowin,techlibs/gowin/cells_sim.v)) + diff --git a/techlibs/gowin/cells_map.v b/techlibs/gowin/cells_map.v new file mode 100644 index 00000000..e1f85eff --- /dev/null +++ b/techlibs/gowin/cells_map.v @@ -0,0 +1,31 @@ +module \$_DFF_N_ (input D, C, output Q); DFFN _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C)); endmodule +module \$_DFF_P_ (input D, C, output Q); DFF _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C)); endmodule + +module \$lut (A, Y); + parameter WIDTH = 0; + parameter LUT = 0; + + input [WIDTH-1:0] A; + output Y; + + generate + if (WIDTH == 1) begin + LUT1 #(.INIT(LUT)) _TECHMAP_REPLACE_ (.F(Y), + .I0(A[0])); + end else + if (WIDTH == 2) begin + LUT2 #(.INIT(LUT)) _TECHMAP_REPLACE_ (.F(Y), + .I0(A[0]), .I1(A[1])); + end else + if (WIDTH == 3) begin + LUT3 #(.INIT(LUT)) _TECHMAP_REPLACE_ (.F(Y), + .I0(A[0]), .I1(A[1]), .I2(A[2])); + end else + if (WIDTH == 4) begin + LUT4 #(.INIT(LUT)) _TECHMAP_REPLACE_ (.F(Y), + .I0(A[0]), .I1(A[1]), .I2(A[2]), .I3(A[3])); + end else begin + wire _TECHMAP_FAIL_ = 1; + end + endgenerate +endmodule diff --git a/techlibs/gowin/cells_sim.v b/techlibs/gowin/cells_sim.v new file mode 100644 index 00000000..3a09c157 --- /dev/null +++ b/techlibs/gowin/cells_sim.v @@ -0,0 +1,51 @@ +module LUT1(output F, input I0); + parameter [1:0] INIT = 0; + assign F = I0 ? INIT[1] : INIT[0]; +endmodule + +module LUT2(output F, input I0, I1); + parameter [3:0] INIT = 0; + wire [ 1: 0] s1 = I1 ? INIT[ 3: 2] : INIT[ 1: 0]; + assign F = I0 ? s1[1] : s1[0]; +endmodule + +module LUT3(output F, input I0, I1, I2); + parameter [7:0] INIT = 0; + wire [ 3: 0] s2 = I2 ? INIT[ 7: 4] : INIT[ 3: 0]; + wire [ 1: 0] s1 = I1 ? s2[ 3: 2] : s2[ 1: 0]; + assign F = I0 ? s1[1] : s1[0]; +endmodule + +module LUT4(output F, input I0, I1, I2, I3); + parameter [15:0] INIT = 0; + wire [ 7: 0] s3 = I3 ? INIT[15: 8] : 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 F = I0 ? s1[1] : s1[0]; +endmodule + +module DFF (output reg Q, input CLK, D); + always @(posedge C) + Q <= D; +endmodule + +module DFFN (output reg Q, input CLK, D); + always @(negedge C) + Q <= D; +endmodule + +module VCC(output V); + assign V = 1; +endmodule + +module GND(output G); + assign G = 0; +endmodule + +module IBUF(output O, input I); + assign O = I; +endmodule + +module OBUF(output O, input I); + assign O = I; +endmodule diff --git a/techlibs/gowin/synth_gowin.cc b/techlibs/gowin/synth_gowin.cc new file mode 100644 index 00000000..129ab839 --- /dev/null +++ b/techlibs/gowin/synth_gowin.cc @@ -0,0 +1,178 @@ +/* + * yosys -- Yosys Open SYnthesis Suite + * + * Copyright (C) 2012 Clifford Wolf <clifford@clifford.at> + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + */ + +#include "kernel/register.h" +#include "kernel/celltypes.h" +#include "kernel/rtlil.h" +#include "kernel/log.h" + +USING_YOSYS_NAMESPACE +PRIVATE_NAMESPACE_BEGIN + +struct SynthGowinPass : public ScriptPass +{ + SynthGowinPass() : ScriptPass("synth_gowin", "synthesis for Gowin FPGAs") { } + + virtual void help() YS_OVERRIDE + { + // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| + log("\n"); + log(" synth_gowin [options]\n"); + log("\n"); + log("This command runs synthesis for Gowin FPGAs. This work is experimental.\n"); + log("\n"); + log(" -top <module>\n"); + log(" use the specified module as top module (default='top')\n"); + log("\n"); + log(" -vout <file>\n"); + log(" write the design to the specified Verilog netlist file. writing of an\n"); + log(" output file is omitted if this parameter is not specified.\n"); + log("\n"); + log(" -run <from_label>:<to_label>\n"); + log(" only run the commands between the labels (see below). an empty\n"); + log(" from label is synonymous to 'begin', and empty to label is\n"); + log(" synonymous to the end of the command list.\n"); + log("\n"); + log(" -retime\n"); + log(" run 'abc' with -dff option\n"); + log("\n"); + log("\n"); + log("The following commands are executed by this synthesis command:\n"); + help_script(); + log("\n"); + } + + string top_opt, vout_file; + bool retime; + + virtual void clear_flags() YS_OVERRIDE + { + top_opt = "-auto-top"; + vout_file = ""; + retime = false; + } + + virtual void execute(std::vector<std::string> args, RTLIL::Design *design) YS_OVERRIDE + { + string run_from, run_to; + clear_flags(); + + size_t argidx; + for (argidx = 1; argidx < args.size(); argidx++) + { + if (args[argidx] == "-top" && argidx+1 < args.size()) { + top_opt = "-top " + args[++argidx]; + continue; + } + if (args[argidx] == "-vout" && argidx+1 < args.size()) { + vout_file = args[++argidx]; + continue; + } + if (args[argidx] == "-run" && argidx+1 < args.size()) { + size_t pos = args[argidx+1].find(':'); + if (pos == std::string::npos) + break; + run_from = args[++argidx].substr(0, pos); + run_to = args[argidx].substr(pos+1); + continue; + } + if (args[argidx] == "-retime") { + retime = true; + continue; + } + break; + } + extra_args(args, argidx, design); + + if (!design->full_selection()) + log_cmd_error("This comannd only operates on fully selected designs!\n"); + + log_header(design, "Executing SYNTH_GOWIN pass.\n"); + log_push(); + + run_script(design, run_from, run_to); + + log_pop(); + } + + virtual void script() YS_OVERRIDE + { + if (check_label("begin")) + { + run("read_verilog -lib +/gowin/cells_sim.v"); + run(stringf("hierarchy -check %s", help_mode ? "-top <top>" : top_opt.c_str())); + } + + if (check_label("flatten")) + { + run("proc"); + run("flatten"); + run("tribuf -logic"); + run("deminout"); + } + + if (check_label("coarse")) + { + run("synth -run coarse"); + } + + if (check_label("fine")) + { + run("opt -fast -mux_undef -undriven -fine"); + run("memory_map"); + run("opt -undriven -fine"); + run("techmap"); + run("clean -purge"); + run("splitnets -ports"); + run("setundef -undriven -zero"); + if (retime || help_mode) + run("abc -dff", "(only if -retime)"); + } + + if (check_label("map_luts")) + { + run("abc -lut 4"); + run("clean"); + } + + if (check_label("map_cells")) + { + run("techmap -map +/gowin/cells_map.v"); + run("hilomap -hicell VCC V -locell GND G"); + run("iopadmap -inpad IBUF O:I -outpad OBUF I:O"); + run("clean -purge"); + } + + if (check_label("check")) + { + run("hierarchy -check"); + run("stat"); + run("check -noinit"); + } + + if (check_label("vout")) + { + if (!vout_file.empty() || help_mode) + run(stringf("write_verilog -attr2comment -defparam -renameprefix gen %s", + help_mode ? "<file-name>" : vout_file.c_str())); + } + } +} SynthGowinPass; + +PRIVATE_NAMESPACE_END diff --git a/techlibs/greenpak4/cells_sim.v b/techlibs/greenpak4/cells_sim.v index 6ae9ae79..80746be0 100644 --- a/techlibs/greenpak4/cells_sim.v +++ b/techlibs/greenpak4/cells_sim.v @@ -131,9 +131,8 @@ endmodule module GP_DELAY(input IN, output reg OUT); parameter DELAY_STEPS = 1; - - //TODO: additional delay/glitch filter mode - + parameter GLITCH_FILTER = 0; + initial OUT = 0; generate @@ -241,6 +240,16 @@ module GP_DFFSRI(input D, CLK, nSR, output reg nQ); end endmodule +module GP_EDGEDET(input IN, output reg OUT); + + parameter EDGE_DIRECTION = "RISING"; + parameter DELAY_STEPS = 1; + parameter GLITCH_FILTER = 0; + + //not implemented for simulation + +endmodule + module GP_IBUF(input IN, output OUT); assign OUT = IN; endmodule @@ -296,6 +305,27 @@ module GP_PGA(input wire VIN_P, input wire VIN_N, input wire VIN_SEL, output reg endmodule +module GP_PGEN(input wire nRST, input wire CLK, output reg OUT); + initial OUT = 0; + parameter PATTERN_DATA = 16'h0; + parameter PATTERN_LEN = 5'd16; + + reg[3:0] count = 0; + always @(posedge CLK) begin + if(!nRST) + OUT <= PATTERN_DATA[0]; + + else begin + count <= count + 1; + OUT <= PATTERN_DATA[count]; + + if( (count + 1) == PATTERN_LEN) + count <= 0; + end + end + +endmodule + module GP_POR(output reg RST_DONE); parameter POR_TIME = 500; @@ -409,7 +439,8 @@ endmodule //keep constraint needed to prevent optimization since we have no outputs (* keep *) module GP_SYSRESET(input RST); - parameter RESET_MODE = "RISING"; + parameter RESET_MODE = "EDGE"; + parameter EDGE_SPEED = 4; //cannot simulate whole system reset diff --git a/techlibs/ice40/synth_ice40.cc b/techlibs/ice40/synth_ice40.cc index 38a9cf9d..2533d3af 100644 --- a/techlibs/ice40/synth_ice40.cc +++ b/techlibs/ice40/synth_ice40.cc @@ -35,7 +35,7 @@ struct SynthIce40Pass : public ScriptPass log("\n"); log(" synth_ice40 [options]\n"); log("\n"); - log("This command runs synthesis for iCE40 FPGAs. This work is experimental.\n"); + log("This command runs synthesis for iCE40 FPGAs.\n"); log("\n"); log(" -top <module>\n"); log(" use the specified module as top module (default='top')\n"); |