summaryrefslogtreecommitdiff
path: root/techlibs
diff options
context:
space:
mode:
Diffstat (limited to 'techlibs')
-rw-r--r--techlibs/common/prep.cc170
-rw-r--r--techlibs/common/simlib.v136
-rw-r--r--techlibs/common/synth.cc177
-rw-r--r--techlibs/common/techmap.v6
-rw-r--r--techlibs/greenpak4/Makefile.inc2
-rw-r--r--techlibs/greenpak4/cells_map.v74
-rw-r--r--techlibs/greenpak4/cells_sim.v425
-rw-r--r--techlibs/greenpak4/gp_dff.lib26
-rw-r--r--techlibs/greenpak4/greenpak4_counters.cc442
-rw-r--r--techlibs/greenpak4/greenpak4_dffinv.cc197
-rw-r--r--techlibs/greenpak4/synth_greenpak4.cc192
-rw-r--r--techlibs/ice40/Makefile.inc1
-rw-r--r--techlibs/ice40/ice40_ffinit.cc38
-rw-r--r--techlibs/ice40/ice40_ffssr.cc9
-rw-r--r--techlibs/ice40/ice40_opt.cc38
-rw-r--r--techlibs/ice40/latches_map.v11
-rw-r--r--techlibs/ice40/synth_ice40.cc210
-rw-r--r--techlibs/xilinx/Makefile.inc1
-rw-r--r--techlibs/xilinx/cells_xtra.sh145
-rw-r--r--techlibs/xilinx/cells_xtra.v3293
-rw-r--r--techlibs/xilinx/synth_xilinx.cc4
21 files changed, 5143 insertions, 454 deletions
diff --git a/techlibs/common/prep.cc b/techlibs/common/prep.cc
index 8bae920d..fac6c4ba 100644
--- a/techlibs/common/prep.cc
+++ b/techlibs/common/prep.cc
@@ -25,22 +25,11 @@
USING_YOSYS_NAMESPACE
PRIVATE_NAMESPACE_BEGIN
-bool check_label(bool &active, std::string run_from, std::string run_to, std::string label)
+struct PrepPass : public ScriptPass
{
- if (!run_from.empty() && run_from == run_to) {
- active = (label == run_from);
- } else {
- if (label == run_from)
- active = true;
- if (label == run_to)
- active = false;
- }
- return active;
-}
+ PrepPass() : ScriptPass("prep", "generic synthesis script") { }
-struct PrepPass : public Pass {
- PrepPass() : Pass("prep", "generic synthesis script") { }
- virtual void help()
+ virtual void help() YS_OVERRIDE
{
// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
log("\n");
@@ -53,6 +42,24 @@ struct PrepPass : public Pass {
log(" -top <module>\n");
log(" use the specified module as top module (default='top')\n");
log("\n");
+ log(" -auto-top\n");
+ log(" automatically determine the top of the design hierarchy\n");
+ log("\n");
+ log(" -flatten\n");
+ log(" flatten the design before synthesis. this will pass '-auto-top' to\n");
+ log(" 'hierarchy' if no top module is specified.\n");
+ log("\n");
+ log(" -ifx\n");
+ log(" passed to 'proc'. uses verilog simulation behavior for verilog if/case\n");
+ log(" undef handling. this also prevents 'wreduce' from being run.\n");
+ log("\n");
+ log(" -memx\n");
+ log(" simulate verilog simulation behavior for out-of-bounds memory accesses\n");
+ log(" using the 'memory_memx' pass. This option implies -nordff.\n");
+ log("\n");
+ log(" -nomem\n");
+ log(" do not run any of the memory_* passes\n");
+ log("\n");
log(" -nordff\n");
log(" passed to 'memory_dff'. prohibits merging of FFs into memory read ports\n");
log("\n");
@@ -63,31 +70,28 @@ struct PrepPass : public Pass {
log("\n");
log("\n");
log("The following commands are executed by this synthesis command:\n");
+ help_script();
log("\n");
- log(" begin:\n");
- log(" hierarchy -check [-top <top>]\n");
- log("\n");
- log(" prep:\n");
- log(" proc\n");
- log(" opt_const\n");
- log(" opt_clean\n");
- log(" check\n");
- log(" opt -keepdc\n");
- log(" wreduce\n");
- log(" memory_dff [-nordff]\n");
- log(" opt_clean\n");
- log(" memory_collect\n");
- log(" opt -keepdc -fast\n");
- log("\n");
- log(" check:\n");
- log(" stat\n");
- log(" check\n");
- log("\n");
}
- virtual void execute(std::vector<std::string> args, RTLIL::Design *design)
+
+ string top_module, fsm_opts, memory_opts;
+ bool autotop, flatten, ifxmode, memxmode, nomemmode;
+
+ virtual void clear_flags() YS_OVERRIDE
+ {
+ top_module.clear();
+ memory_opts.clear();
+
+ autotop = false;
+ flatten = false;
+ ifxmode = false;
+ memxmode = false;
+ nomemmode = false;
+ }
+
+ virtual void execute(std::vector<std::string> args, RTLIL::Design *design) YS_OVERRIDE
{
- std::string top_module, memory_opts;
- std::string run_from, run_to;
+ string run_from, run_to;
size_t argidx;
for (argidx = 1; argidx < args.size(); argidx++)
@@ -107,6 +111,27 @@ struct PrepPass : public Pass {
}
continue;
}
+ if (args[argidx] == "-auto-top") {
+ autotop = true;
+ continue;
+ }
+ if (args[argidx] == "-flatten") {
+ flatten = true;
+ continue;
+ }
+ if (args[argidx] == "-ifx") {
+ ifxmode = true;
+ continue;
+ }
+ if (args[argidx] == "-memx") {
+ memxmode = true;
+ memory_opts += " -nordff";
+ continue;
+ }
+ if (args[argidx] == "-nomem") {
+ nomemmode = true;
+ continue;
+ }
if (args[argidx] == "-nordff") {
memory_opts += " -nordff";
continue;
@@ -118,40 +143,65 @@ struct PrepPass : public Pass {
if (!design->full_selection())
log_cmd_error("This comannd only operates on fully selected designs!\n");
- bool active = run_from.empty();
-
- log_header("Executing PREP pass.\n");
+ log_header(design, "Executing PREP pass.\n");
log_push();
- if (check_label(active, run_from, run_to, "begin"))
+ run_script(design, run_from, run_to);
+
+ log_pop();
+ }
+
+ virtual void script() YS_OVERRIDE
+ {
+
+ if (check_label("begin"))
{
- if (top_module.empty())
- Pass::call(design, stringf("hierarchy -check"));
- else
- Pass::call(design, stringf("hierarchy -check -top %s", top_module.c_str()));
+ if (help_mode) {
+ run("hierarchy -check [-top <top> | -auto-top]");
+ } else {
+ if (top_module.empty()) {
+ if (flatten || autotop)
+ run("hierarchy -check -auto-top");
+ else
+ run("hierarchy -check");
+ } else
+ run(stringf("hierarchy -check -top %s", top_module.c_str()));
+ }
}
- if (check_label(active, run_from, run_to, "coarse"))
+ if (check_label("coarse"))
{
- Pass::call(design, "proc");
- Pass::call(design, "opt_const");
- Pass::call(design, "opt_clean");
- Pass::call(design, "check");
- Pass::call(design, "opt -keepdc");
- Pass::call(design, "wreduce");
- Pass::call(design, "memory_dff" + memory_opts);
- Pass::call(design, "opt_clean");
- Pass::call(design, "memory_collect");
- Pass::call(design, "opt -keepdc -fast");
+ if (help_mode)
+ run("proc [-ifx]");
+ else
+ run(ifxmode ? "proc -ifx" : "proc");
+ if (help_mode || flatten)
+ run("flatten", "(if -flatten)");
+ run("opt_expr -keepdc");
+ run("opt_clean");
+ run("check");
+ run("opt -keepdc");
+ if (!ifxmode) {
+ if (help_mode)
+ run("wreduce [-memx]");
+ else
+ run(memxmode ? "wreduce -memx" : "wreduce");
+ }
+ if (!nomemmode) {
+ run("memory_dff" + (help_mode ? " [-nordff]" : memory_opts));
+ if (help_mode || memxmode)
+ run("memory_memx", "(if -memx)");
+ run("opt_clean");
+ run("memory_collect");
+ }
+ run("opt -keepdc -fast");
}
- if (check_label(active, run_from, run_to, "check"))
+ if (check_label("check"))
{
- Pass::call(design, "stat");
- Pass::call(design, "check");
+ run("stat");
+ run("check");
}
-
- log_pop();
}
} PrepPass;
diff --git a/techlibs/common/simlib.v b/techlibs/common/simlib.v
index a2dc466d..922a47ca 100644
--- a/techlibs/common/simlib.v
+++ b/techlibs/common/simlib.v
@@ -33,6 +33,12 @@
// --------------------------------------------------------
+// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
+//-
+//- $not (A, Y)
+//-
+//- A bit-wise inverter. This corresponds to the Verilog unary prefix '~' operator.
+//-
module \$not (A, Y);
parameter A_SIGNED = 0;
@@ -55,6 +61,12 @@ endmodule
// --------------------------------------------------------
+// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
+//-
+//- $pos (A, Y)
+//-
+//- A buffer. This corresponds to the Verilog unary prefix '+' operator.
+//-
module \$pos (A, Y);
parameter A_SIGNED = 0;
@@ -76,6 +88,12 @@ endmodule
// --------------------------------------------------------
+// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
+//-
+//- $neg (A, Y)
+//-
+//- An arithmetic inverter. This corresponds to the Verilog unary prefix '-' operator.
+//-
module \$neg (A, Y);
parameter A_SIGNED = 0;
@@ -97,6 +115,12 @@ endmodule
// --------------------------------------------------------
+// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
+//-
+//- $and (A, B, Y)
+//-
+//- A bit-wise AND. This corresponds to the Verilog '&' operator.
+//-
module \$and (A, B, Y);
parameter A_SIGNED = 0;
@@ -121,6 +145,12 @@ endmodule
// --------------------------------------------------------
+// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
+//-
+//- $or (A, B, Y)
+//-
+//- A bit-wise OR. This corresponds to the Verilog '|' operator.
+//-
module \$or (A, B, Y);
parameter A_SIGNED = 0;
@@ -145,6 +175,12 @@ endmodule
// --------------------------------------------------------
+// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
+//-
+//- $xor (A, B, Y)
+//-
+//- A bit-wise XOR. This corresponds to the Verilog '^' operator.
+//-
module \$xor (A, B, Y);
parameter A_SIGNED = 0;
@@ -169,6 +205,12 @@ endmodule
// --------------------------------------------------------
+// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
+//-
+//- $xnor (A, B, Y)
+//-
+//- A bit-wise XNOR. This corresponds to the Verilog '~^' operator.
+//-
module \$xnor (A, B, Y);
parameter A_SIGNED = 0;
@@ -193,6 +235,12 @@ endmodule
// --------------------------------------------------------
+// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
+//-
+//- $reduce_and (A, B, Y)
+//-
+//- An AND reduction. This corresponds to the Verilog unary prefix '&' operator.
+//-
module \$reduce_and (A, Y);
parameter A_SIGNED = 0;
@@ -214,6 +262,12 @@ endmodule
// --------------------------------------------------------
+// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
+//-
+//- $reduce_or (A, B, Y)
+//-
+//- An OR reduction. This corresponds to the Verilog unary prefix '|' operator.
+//-
module \$reduce_or (A, Y);
parameter A_SIGNED = 0;
@@ -235,6 +289,12 @@ endmodule
// --------------------------------------------------------
+// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
+//-
+//- $reduce_xor (A, B, Y)
+//-
+//- A XOR reduction. This corresponds to the Verilog unary prefix '^' operator.
+//-
module \$reduce_xor (A, Y);
parameter A_SIGNED = 0;
@@ -256,6 +316,12 @@ endmodule
// --------------------------------------------------------
+// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
+//-
+//- $reduce_xnor (A, B, Y)
+//-
+//- A XNOR reduction. This corresponds to the Verilog unary prefix '~^' operator.
+//-
module \$reduce_xnor (A, Y);
parameter A_SIGNED = 0;
@@ -277,6 +343,13 @@ endmodule
// --------------------------------------------------------
+// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
+//-
+//- $reduce_bool (A, B, Y)
+//-
+//- An OR reduction. This cell type is used instead of $reduce_or when a signal is
+//- implicitly converted to a boolean signal, e.g. for operands of '&&' and '||'.
+//-
module \$reduce_bool (A, Y);
parameter A_SIGNED = 0;
@@ -1156,6 +1229,34 @@ endmodule
`endif
// --------------------------------------------------------
+module \$sop (A, Y);
+
+parameter WIDTH = 0;
+parameter DEPTH = 0;
+parameter TABLE = 0;
+
+input [WIDTH-1:0] A;
+output reg Y;
+
+integer i, j;
+reg match;
+
+always @* begin
+ Y = 0;
+ for (i = 0; i < DEPTH; i=i+1) begin
+ match = 1;
+ for (j = 0; j < WIDTH; j=j+1) begin
+ if (TABLE[2*WIDTH*i + 2*j + 0] && A[j]) match = 0;
+ if (TABLE[2*WIDTH*i + 2*j + 1] && !A[j]) match = 0;
+ end
+ if (match) Y = 1;
+ end
+end
+
+endmodule
+
+// --------------------------------------------------------
+
module \$tribuf (A, EN, Y);
parameter WIDTH = 0;
@@ -1204,6 +1305,35 @@ endmodule
// --------------------------------------------------------
+module \$initstate (Y);
+
+output reg Y = 1;
+reg [3:0] cnt = 1;
+reg trig = 0;
+
+initial trig <= 1;
+
+always @(cnt, trig) begin
+ Y <= |cnt;
+ cnt <= cnt + |cnt;
+end
+
+endmodule
+
+// --------------------------------------------------------
+
+module \$anyconst (Y);
+
+parameter WIDTH = 0;
+
+output [WIDTH-1:0] Y;
+
+assign Y = 'bx;
+
+endmodule
+
+// --------------------------------------------------------
+
module \$equiv (A, B, Y);
input A, B;
@@ -1239,7 +1369,7 @@ wire [WIDTH-1:0] pos_clr = CLR_POLARITY ? CLR : ~CLR;
genvar i;
generate
- for (i = 0; i < WIDTH; i = i+1) begin:bit
+ for (i = 0; i < WIDTH; i = i+1) begin:bitslices
always @(posedge pos_set[i], posedge pos_clr[i])
if (pos_clr[i])
Q[i] <= 0;
@@ -1308,7 +1438,7 @@ wire [WIDTH-1:0] pos_clr = CLR_POLARITY ? CLR : ~CLR;
genvar i;
generate
- for (i = 0; i < WIDTH; i = i+1) begin:bit
+ for (i = 0; i < WIDTH; i = i+1) begin:bitslices
always @(posedge pos_set[i], posedge pos_clr[i], posedge pos_clk)
if (pos_clr[i])
Q[i] <= 0;
@@ -1384,7 +1514,7 @@ wire [WIDTH-1:0] pos_clr = CLR_POLARITY ? CLR : ~CLR;
genvar i;
generate
- for (i = 0; i < WIDTH; i = i+1) begin:bit
+ for (i = 0; i < WIDTH; i = i+1) begin:bitslices
always @*
if (pos_clr[i])
Q[i] = 0;
diff --git a/techlibs/common/synth.cc b/techlibs/common/synth.cc
index 83d00f32..11ebe533 100644
--- a/techlibs/common/synth.cc
+++ b/techlibs/common/synth.cc
@@ -25,22 +25,11 @@
USING_YOSYS_NAMESPACE
PRIVATE_NAMESPACE_BEGIN
-bool check_label(bool &active, std::string run_from, std::string run_to, std::string label)
+struct SynthPass : public ScriptPass
{
- if (!run_from.empty() && run_from == run_to) {
- active = (label == run_from);
- } else {
- if (label == run_from)
- active = true;
- if (label == run_to)
- active = false;
- }
- return active;
-}
+ SynthPass() : ScriptPass("synth", "generic synthesis script") { }
-struct SynthPass : public Pass {
- SynthPass() : Pass("synth", "generic synthesis script") { }
- virtual void help()
+ virtual void help() YS_OVERRIDE
{
// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
log("\n");
@@ -52,6 +41,13 @@ struct SynthPass : public Pass {
log(" -top <module>\n");
log(" use the specified module as top module (default='top')\n");
log("\n");
+ log(" -auto-top\n");
+ log(" automatically determine the top of the design hierarchy\n");
+ log("\n");
+ log(" -flatten\n");
+ log(" flatten the design before synthesis. this will pass '-auto-top' to\n");
+ log(" 'hierarchy' if no top module is specified.\n");
+ log("\n");
log(" -encfile <file>\n");
log(" passed to 'fsm_recode' via 'fsm'\n");
log("\n");
@@ -75,49 +71,30 @@ struct SynthPass : public Pass {
log("\n");
log("\n");
log("The following commands are executed by this synthesis command:\n");
- log("\n");
- log(" begin:\n");
- log(" hierarchy -check [-top <top>]\n");
- log("\n");
- log(" coarse:\n");
- log(" proc\n");
- log(" opt_const\n");
- log(" opt_clean\n");
- log(" check\n");
- log(" opt\n");
- log(" wreduce\n");
- log(" alumacc\n");
- log(" share\n");
- log(" opt\n");
- log(" fsm\n");
- log(" opt -fast\n");
- log(" memory -nomap\n");
- log(" opt_clean\n");
- log("\n");
- log(" fine:\n");
- log(" opt -fast -full\n");
- log(" memory_map\n");
- log(" opt -full\n");
- log(" techmap\n");
- log(" opt -fast\n");
- #ifdef YOSYS_ENABLE_ABC
- log(" abc -fast\n");
- log(" opt -fast\n");
- #endif
- log("\n");
- log(" check:\n");
- log(" hierarchy -check\n");
- log(" stat\n");
- log(" check\n");
+ help_script();
log("\n");
}
- virtual void execute(std::vector<std::string> args, RTLIL::Design *design)
+
+ string top_module, fsm_opts, memory_opts;
+ bool autotop, flatten, noalumacc, nofsm, noabc;
+
+ virtual void clear_flags() YS_OVERRIDE
+ {
+ top_module.clear();
+ fsm_opts.clear();
+ memory_opts.clear();
+
+ autotop = false;
+ flatten = false;
+ noalumacc = false;
+ nofsm = false;
+ noabc = false;
+ }
+
+ virtual void execute(std::vector<std::string> args, RTLIL::Design *design) YS_OVERRIDE
{
- std::string top_module, fsm_opts, memory_opts;
- std::string run_from, run_to;
- bool noalumacc = false;
- bool nofsm = false;
- bool noabc = false;
+ string run_from, run_to;
+ clear_flags();
size_t argidx;
for (argidx = 1; argidx < args.size(); argidx++)
@@ -141,6 +118,14 @@ struct SynthPass : public Pass {
}
continue;
}
+ if (args[argidx] == "-auto-top") {
+ autotop = true;
+ continue;
+ }
+ if (args[argidx] == "-flatten") {
+ flatten = true;
+ continue;
+ }
if (args[argidx] == "-nofsm") {
nofsm = true;
continue;
@@ -164,62 +149,74 @@ struct SynthPass : public Pass {
if (!design->full_selection())
log_cmd_error("This comannd only operates on fully selected designs!\n");
- bool active = run_from.empty();
-
- log_header("Executing SYNTH pass.\n");
+ log_header(design, "Executing SYNTH pass.\n");
log_push();
- if (check_label(active, run_from, run_to, "begin"))
+ run_script(design, run_from, run_to);
+
+ log_pop();
+ }
+
+ virtual void script() YS_OVERRIDE
+ {
+ if (check_label("begin"))
{
- if (top_module.empty())
- Pass::call(design, stringf("hierarchy -check"));
- else
- Pass::call(design, stringf("hierarchy -check -top %s", top_module.c_str()));
+ if (help_mode) {
+ run("hierarchy -check [-top <top> | -auto-top]");
+ } else {
+ if (top_module.empty()) {
+ if (flatten || autotop)
+ run("hierarchy -check -auto-top");
+ else
+ run("hierarchy -check");
+ } else
+ run(stringf("hierarchy -check -top %s", top_module.c_str()));
+ }
}
- if (check_label(active, run_from, run_to, "coarse"))
+ if (check_label("coarse"))
{
- Pass::call(design, "proc");
- Pass::call(design, "opt_const");
- Pass::call(design, "opt_clean");
- Pass::call(design, "check");
- Pass::call(design, "opt");
- Pass::call(design, "wreduce");
+ run("proc");
+ if (help_mode || flatten)
+ run("flatten", "(if -flatten)");
+ run("opt_expr");
+ run("opt_clean");
+ run("check");
+ run("opt");
+ run("wreduce");
if (!noalumacc)
- Pass::call(design, "alumacc");
- Pass::call(design, "share");
- Pass::call(design, "opt");
+ run("alumacc");
+ run("share");
+ run("opt");
if (!nofsm)
- Pass::call(design, "fsm" + fsm_opts);
- Pass::call(design, "opt -fast");
- Pass::call(design, "memory -nomap" + memory_opts);
- Pass::call(design, "opt_clean");
+ run("fsm" + fsm_opts);
+ run("opt -fast");
+ run("memory -nomap" + memory_opts);
+ run("opt_clean");
}
- if (check_label(active, run_from, run_to, "fine"))
+ if (check_label("fine"))
{
- Pass::call(design, "opt -fast -full");
- Pass::call(design, "memory_map");
- Pass::call(design, "opt -full");
- Pass::call(design, "techmap");
- Pass::call(design, "opt -fast");
+ run("opt -fast -full");
+ run("memory_map");
+ run("opt -full");
+ run("techmap");
+ run("opt -fast");
if (!noabc) {
#ifdef YOSYS_ENABLE_ABC
- Pass::call(design, "abc -fast");
- Pass::call(design, "opt -fast");
+ run("abc -fast");
+ run("opt -fast");
#endif
}
}
- if (check_label(active, run_from, run_to, "check"))
+ if (check_label("check"))
{
- Pass::call(design, "hierarchy -check");
- Pass::call(design, "stat");
- Pass::call(design, "check");
+ run("hierarchy -check");
+ run("stat");
+ run("check");
}
-
- log_pop();
}
} SynthPass;
diff --git a/techlibs/common/techmap.v b/techlibs/common/techmap.v
index ae08c3d1..90c4ed7e 100644
--- a/techlibs/common/techmap.v
+++ b/techlibs/common/techmap.v
@@ -93,7 +93,7 @@ module _90_shift_ops_shr_shl_sshl_sshr (A, B, Y);
localparam BB_WIDTH = `MIN($clog2(shift_left ? Y_WIDTH : A_SIGNED ? WIDTH : A_WIDTH) + 1, B_WIDTH);
wire [1023:0] _TECHMAP_DO_00_ = "proc;;";
- wire [1023:0] _TECHMAP_DO_01_ = "RECURSION; CONSTMAP; opt_muxtree; opt_const -mux_undef -mux_bool -fine;;;";
+ wire [1023:0] _TECHMAP_DO_01_ = "RECURSION; CONSTMAP; opt_muxtree; opt_expr -mux_undef -mux_bool -fine;;;";
integer i;
reg [WIDTH-1:0] buffer;
@@ -136,7 +136,7 @@ module _90_shift_shiftx (A, B, Y);
localparam extbit = _TECHMAP_CELLTYPE_ == "$shift" ? 1'b0 : 1'bx;
wire [1023:0] _TECHMAP_DO_00_ = "proc;;";
- wire [1023:0] _TECHMAP_DO_01_ = "CONSTMAP; opt_muxtree; opt_const -mux_undef -mux_bool -fine;;;";
+ wire [1023:0] _TECHMAP_DO_01_ = "CONSTMAP; opt_muxtree; opt_expr -mux_undef -mux_bool -fine;;;";
integer i;
reg [WIDTH-1:0] buffer;
@@ -452,7 +452,7 @@ endmodule
`ifndef NOLUT
(* techmap_simplemap *)
-(* techmap_celltype = "$lut" *)
+(* techmap_celltype = "$lut $sop" *)
module _90_lut;
endmodule
`endif
diff --git a/techlibs/greenpak4/Makefile.inc b/techlibs/greenpak4/Makefile.inc
index 5808e7bd..1c9871e2 100644
--- a/techlibs/greenpak4/Makefile.inc
+++ b/techlibs/greenpak4/Makefile.inc
@@ -1,5 +1,7 @@
OBJS += techlibs/greenpak4/synth_greenpak4.o
+OBJS += techlibs/greenpak4/greenpak4_counters.o
+OBJS += techlibs/greenpak4/greenpak4_dffinv.o
$(eval $(call add_share_file,share/greenpak4,techlibs/greenpak4/cells_map.v))
$(eval $(call add_share_file,share/greenpak4,techlibs/greenpak4/cells_sim.v))
diff --git a/techlibs/greenpak4/cells_map.v b/techlibs/greenpak4/cells_map.v
index 667d853d..111a77a1 100644
--- a/techlibs/greenpak4/cells_map.v
+++ b/techlibs/greenpak4/cells_map.v
@@ -1,20 +1,61 @@
-module \$_DFF_P_ (input D, C, output Q);
- GP_DFF _TECHMAP_REPLACE_ (
+module GP_DFFS(input D, CLK, nSET, output reg Q);
+ parameter [0:0] INIT = 1'bx;
+ GP_DFFSR #(
+ .INIT(INIT),
+ .SRMODE(1'b1),
+ ) _TECHMAP_REPLACE_ (
.D(D),
- .Q(Q),
- .CLK(C),
- .nRSTZ(1'b1),
- .nSETZ(1'b1)
+ .CLK(CLK),
+ .nSR(nSET),
+ .Q(Q)
);
endmodule
-module \$_DFFSR_PNN_ (input C, S, R, D, output Q);
- GP_DFF _TECHMAP_REPLACE_ (
+module GP_DFFR(input D, CLK, nRST, output reg Q);
+ parameter [0:0] INIT = 1'bx;
+ GP_DFFSR #(
+ .INIT(INIT),
+ .SRMODE(1'b0),
+ ) _TECHMAP_REPLACE_ (
.D(D),
- .Q(Q),
- .CLK(C),
- .nRSTZ(R),
- .nSETZ(S)
+ .CLK(CLK),
+ .nSR(nRST),
+ .Q(Q)
+ );
+endmodule
+
+module GP_DFFSI(input D, CLK, nSET, output reg nQ);
+ parameter [0:0] INIT = 1'bx;
+ GP_DFFSRI #(
+ .INIT(INIT),
+ .SRMODE(1'b1),
+ ) _TECHMAP_REPLACE_ (
+ .D(D),
+ .CLK(CLK),
+ .nSR(nSET),
+ .nQ(nQ)
+ );
+endmodule
+
+module GP_DFFRI(input D, CLK, nRST, output reg nQ);
+ parameter [0:0] INIT = 1'bx;
+ GP_DFFSRI #(
+ .INIT(INIT),
+ .SRMODE(1'b0),
+ ) _TECHMAP_REPLACE_ (
+ .D(D),
+ .CLK(CLK),
+ .nSR(nRST),
+ .nQ(nQ)
+ );
+endmodule
+
+module GP_OBUFT(input IN, input OE, output OUT);
+ GP_IOBUF _TECHMAP_REPLACE_ (
+ .IN(IN),
+ .OE(OE),
+ .IO(OUT),
+ .OUT()
);
endmodule
@@ -27,8 +68,13 @@ module \$lut (A, Y);
generate
if (WIDTH == 1) begin
- GP_2LUT #(.INIT({2'b00, LUT})) _TECHMAP_REPLACE_ (.OUT(Y),
- .IN0(A[0]), .IN1(1'b0));
+ if(LUT == 2'b01) begin
+ GP_INV _TECHMAP_REPLACE_ (.OUT(Y), .IN(A[0]) );
+ end
+ else begin
+ GP_2LUT #(.INIT({2'b00, LUT})) _TECHMAP_REPLACE_ (.OUT(Y),
+ .IN0(A[0]), .IN1(1'b0));
+ end
end else
if (WIDTH == 2) begin
GP_2LUT #(.INIT(LUT)) _TECHMAP_REPLACE_ (.OUT(Y),
diff --git a/techlibs/greenpak4/cells_sim.v b/techlibs/greenpak4/cells_sim.v
index d9ddaacc..6ae9ae79 100644
--- a/techlibs/greenpak4/cells_sim.v
+++ b/techlibs/greenpak4/cells_sim.v
@@ -1,13 +1,4 @@
-module GP_DFF(input D, CLK, nRSTZ, nSETZ, output reg Q);
- always @(posedge CLK, negedge nRSTZ, negedge nSETZ) begin
- if (!nRSTZ)
- Q <= 1'b0;
- else if (!nSETZ)
- Q <= 1'b1;
- else
- Q <= D;
- end
-endmodule
+`timescale 1ns/1ps
module GP_2LUT(input IN0, IN1, output OUT);
parameter [3:0] INIT = 0;
@@ -23,3 +14,417 @@ module GP_4LUT(input IN0, IN1, IN2, IN3, output OUT);
parameter [15:0] INIT = 0;
assign OUT = INIT[{IN3, IN2, IN1, IN0}];
endmodule
+
+module GP_ABUF(input wire IN, output wire OUT);
+
+ assign OUT = IN;
+
+ //cannot simulate mixed signal IP
+
+endmodule
+
+module GP_ACMP(input wire PWREN, input wire VIN, input wire VREF, output reg OUT);
+
+ parameter BANDWIDTH = "HIGH";
+ parameter VIN_ATTEN = 1;
+ parameter VIN_ISRC_EN = 0;
+ parameter HYSTERESIS = 0;
+
+ initial OUT = 0;
+
+ //cannot simulate mixed signal IP
+
+endmodule
+
+module GP_BANDGAP(output reg OK);
+ parameter AUTO_PWRDN = 1;
+ parameter CHOPPER_EN = 1;
+ parameter OUT_DELAY = 100;
+
+ //cannot simulate mixed signal IP
+
+endmodule
+
+module GP_COUNT8(input CLK, input wire RST, output reg OUT);
+
+ parameter RESET_MODE = "RISING";
+
+ parameter COUNT_TO = 8'h1;
+ parameter CLKIN_DIVIDE = 1;
+
+ //more complex hard IP blocks are not supported for simulation yet
+
+ reg[7:0] count = COUNT_TO;
+
+ //Combinatorially output whenever we wrap low
+ always @(*) begin
+ OUT <= (count == 8'h0);
+ end
+
+ //POR or SYSRST reset value is COUNT_TO. Datasheet is unclear but conversations w/ Silego confirm.
+ //Runtime reset value is clearly 0 except in count/FSM cells where it's configurable but we leave at 0 for now.
+ //Datasheet seems to indicate that reset is asynchronous, but for now we model as sync due to Yosys issues...
+ always @(posedge CLK) begin
+
+ count <= count - 1'd1;
+
+ if(count == 0)
+ count <= COUNT_TO;
+
+ /*
+ if((RESET_MODE == "RISING") && RST)
+ count <= 0;
+ if((RESET_MODE == "FALLING") && !RST)
+ count <= 0;
+ if((RESET_MODE == "BOTH") && RST)
+ count <= 0;
+ */
+ end
+
+endmodule
+
+module GP_COUNT14(input CLK, input wire RST, output reg OUT);
+
+ parameter RESET_MODE = "RISING";
+
+ parameter COUNT_TO = 14'h1;
+ parameter CLKIN_DIVIDE = 1;
+
+ //more complex hard IP blocks are not supported for simulation yet
+
+endmodule
+
+module GP_COUNT8_ADV(input CLK, input RST, output reg OUT,
+ input UP, input KEEP);
+
+ parameter RESET_MODE = "RISING";
+ parameter RESET_VALUE = "ZERO";
+
+ parameter COUNT_TO = 8'h1;
+ parameter CLKIN_DIVIDE = 1;
+
+ //more complex hard IP blocks are not supported for simulation yet
+
+endmodule
+
+module GP_COUNT14_ADV(input CLK, input RST, output reg OUT,
+ input UP, input KEEP);
+
+ parameter RESET_MODE = "RISING";
+ parameter RESET_VALUE = "ZERO";
+
+ parameter COUNT_TO = 14'h1;
+ parameter CLKIN_DIVIDE = 1;
+
+ //more complex hard IP blocks are not supported for simulation yet
+
+endmodule
+
+module GP_DAC(input[7:0] DIN, input wire VREF, output reg VOUT);
+
+ initial VOUT = 0;
+
+ //analog hard IP is not supported for simulation
+
+endmodule
+
+module GP_DELAY(input IN, output reg OUT);
+
+ parameter DELAY_STEPS = 1;
+
+ //TODO: additional delay/glitch filter mode
+
+ initial OUT = 0;
+
+ generate
+
+ //TODO: These delays are PTV dependent! For now, hard code 3v3 timing
+ //Change simulation-mode delay depending on global Vdd range (how to specify this?)
+ always @(*) begin
+ case(DELAY_STEPS)
+ 1: #166 OUT = IN;
+ 2: #318 OUT = IN;
+ 2: #471 OUT = IN;
+ 3: #622 OUT = IN;
+ default: begin
+ $display("ERROR: GP_DELAY must have DELAY_STEPS in range [1,4]");
+ $finish;
+ end
+ endcase
+ end
+
+ endgenerate
+
+endmodule
+
+module GP_DFF(input D, CLK, output reg Q);
+ parameter [0:0] INIT = 1'bx;
+ initial Q = INIT;
+ always @(posedge CLK) begin
+ Q <= D;
+ end
+endmodule
+
+module GP_DFFI(input D, CLK, output reg nQ);
+ parameter [0:0] INIT = 1'bx;
+ initial nQ = INIT;
+ always @(posedge CLK) begin
+ nQ <= ~D;
+ end
+endmodule
+
+module GP_DFFR(input D, CLK, nRST, output reg Q);
+ parameter [0:0] INIT = 1'bx;
+ initial Q = INIT;
+ always @(posedge CLK, negedge nRST) begin
+ if (!nRST)
+ Q <= 1'b0;
+ else
+ Q <= D;
+ end
+endmodule
+
+module GP_DFFRI(input D, CLK, nRST, output reg nQ);
+ parameter [0:0] INIT = 1'bx;
+ initial nQ = INIT;
+ always @(posedge CLK, negedge nRST) begin
+ if (!nRST)
+ nQ <= 1'b1;
+ else
+ nQ <= ~D;
+ end
+endmodule
+
+module GP_DFFS(input D, CLK, nSET, output reg Q);
+ parameter [0:0] INIT = 1'bx;
+ initial Q = INIT;
+ always @(posedge CLK, negedge nSET) begin
+ if (!nSET)
+ Q <= 1'b1;
+ else
+ Q <= D;
+ end
+endmodule
+
+module GP_DFFSI(input D, CLK, nSET, output reg nQ);
+ parameter [0:0] INIT = 1'bx;
+ initial nQ = INIT;
+ always @(posedge CLK, negedge nSET) begin
+ if (!nSET)
+ nQ <= 1'b0;
+ else
+ nQ <= ~D;
+ end
+endmodule
+
+module GP_DFFSR(input D, CLK, nSR, output reg Q);
+ parameter [0:0] INIT = 1'bx;
+ parameter [0:0] SRMODE = 1'bx;
+ initial Q = INIT;
+ always @(posedge CLK, negedge nSR) begin
+ if (!nSR)
+ Q <= SRMODE;
+ else
+ Q <= D;
+ end
+endmodule
+
+module GP_DFFSRI(input D, CLK, nSR, output reg nQ);
+ parameter [0:0] INIT = 1'bx;
+ parameter [0:0] SRMODE = 1'bx;
+ initial nQ = INIT;
+ always @(posedge CLK, negedge nSR) begin
+ if (!nSR)
+ nQ <= ~SRMODE;
+ else
+ nQ <= ~D;
+ end
+endmodule
+
+module GP_IBUF(input IN, output OUT);
+ assign OUT = IN;
+endmodule
+
+module GP_IOBUF(input IN, input OE, output OUT, inout IO);
+ assign OUT = IO;
+ assign IO = OE ? IN : 1'bz;
+endmodule
+
+module GP_INV(input IN, output OUT);
+ assign OUT = ~IN;
+endmodule
+
+module GP_LFOSC(input PWRDN, output reg CLKOUT);
+
+ parameter PWRDN_EN = 0;
+ parameter AUTO_PWRDN = 0;
+ parameter OUT_DIV = 1;
+
+ initial CLKOUT = 0;
+
+ //auto powerdown not implemented for simulation
+ //output dividers not implemented for simulation
+
+ always begin
+ if(PWRDN)
+ CLKOUT = 0;
+ else begin
+ //half period of 1730 Hz
+ #289017;
+ CLKOUT = ~CLKOUT;
+ end
+ end
+
+endmodule
+
+module GP_OBUF(input IN, output OUT);
+ assign OUT = IN;
+endmodule
+
+module GP_OBUFT(input IN, input OE, output OUT);
+ assign OUT = OE ? IN : 1'bz;
+endmodule
+
+module GP_PGA(input wire VIN_P, input wire VIN_N, input wire VIN_SEL, output reg VOUT);
+
+ parameter GAIN = 1;
+ parameter INPUT_MODE = "SINGLE";
+
+ initial VOUT = 0;
+
+ //cannot simulate mixed signal IP
+
+endmodule
+
+module GP_POR(output reg RST_DONE);
+ parameter POR_TIME = 500;
+
+ initial begin
+ RST_DONE = 0;
+
+ if(POR_TIME == 4)
+ #4000;
+ else if(POR_TIME == 500)
+ #500000;
+ else begin
+ $display("ERROR: bad POR_TIME for GP_POR cell");
+ $finish;
+ end
+
+ RST_DONE = 1;
+
+ end
+
+endmodule
+
+module GP_RCOSC(input PWRDN, output reg CLKOUT_HARDIP, output reg CLKOUT_FABRIC);
+
+ parameter PWRDN_EN = 0;
+ parameter AUTO_PWRDN = 0;
+ parameter HARDIP_DIV = 1;
+ parameter FABRIC_DIV = 1;
+ parameter OSC_FREQ = "25k";
+
+ initial CLKOUT_HARDIP = 0;
+ initial CLKOUT_FABRIC = 0;
+
+ //output dividers not implemented for simulation
+ //auto powerdown not implemented for simulation
+
+ always begin
+ if(PWRDN) begin
+ CLKOUT_HARDIP = 0;
+ CLKOUT_FABRIC = 0;
+ end
+ else begin
+
+ if(OSC_FREQ == "25k") begin
+ //half period of 25 kHz
+ #20000;
+ end
+
+ else begin
+ //half period of 2 MHz
+ #250;
+ end
+
+ CLKOUT_HARDIP = ~CLKOUT_HARDIP;
+ CLKOUT_FABRIC = ~CLKOUT_FABRIC;
+ end
+ end
+
+endmodule
+
+module GP_RINGOSC(input PWRDN, output reg CLKOUT_HARDIP, output reg CLKOUT_FABRIC);
+
+ parameter PWRDN_EN = 0;
+ parameter AUTO_PWRDN = 0;
+ parameter HARDIP_DIV = 1;
+ parameter FABRIC_DIV = 1;
+
+ initial CLKOUT_HARDIP = 0;
+ initial CLKOUT_FABRIC = 0;
+
+ //output dividers not implemented for simulation
+ //auto powerdown not implemented for simulation
+
+ always begin
+ if(PWRDN) begin
+ CLKOUT_HARDIP = 0;
+ CLKOUT_FABRIC = 0;
+ end
+ else begin
+ //half period of 27 MHz
+ #18.518;
+ CLKOUT_HARDIP = ~CLKOUT_HARDIP;
+ CLKOUT_FABRIC = ~CLKOUT_FABRIC;
+ end
+ end
+
+endmodule
+
+module GP_SHREG(input nRST, input CLK, input IN, output OUTA, output OUTB);
+
+ parameter OUTA_TAP = 1;
+ parameter OUTA_INVERT = 0;
+ parameter OUTB_TAP = 1;
+
+ reg[15:0] shreg = 0;
+
+ always @(posedge CLK, negedge nRST) begin
+
+ if(!nRST)
+ shreg = 0;
+
+ else
+ shreg <= {shreg[14:0], IN};
+
+ end
+
+ assign OUTA = (OUTA_INVERT) ? ~shreg[OUTA_TAP - 1] : shreg[OUTA_TAP - 1];
+ assign OUTB = shreg[OUTB_TAP - 1];
+
+endmodule
+
+//keep constraint needed to prevent optimization since we have no outputs
+(* keep *)
+module GP_SYSRESET(input RST);
+ parameter RESET_MODE = "RISING";
+
+ //cannot simulate whole system reset
+
+endmodule
+
+module GP_VDD(output OUT);
+ assign OUT = 1;
+endmodule
+
+module GP_VREF(input VIN, output reg VOUT);
+ parameter VIN_DIV = 1;
+ parameter VREF = 0;
+ //cannot simulate mixed signal IP
+endmodule
+
+module GP_VSS(output OUT);
+ assign OUT = 0;
+endmodule
diff --git a/techlibs/greenpak4/gp_dff.lib b/techlibs/greenpak4/gp_dff.lib
index 9e2e46cb..b4b8c102 100644
--- a/techlibs/greenpak4/gp_dff.lib
+++ b/techlibs/greenpak4/gp_dff.lib
@@ -1,26 +1,36 @@
library(gp_dff) {
- cell(GP_DFF_NOSR) {
+ cell(GP_DFF) {
area: 1;
ff("IQ", "IQN") { clocked_on: CLK;
- next_state: D; }
+ next_state: D; }
pin(CLK) { direction: input;
- clock: true; }
+ clock: true; }
pin(D) { direction: input; }
pin(Q) { direction: output;
function: "IQ"; }
}
- cell(GP_DFF_SR) {
+ cell(GP_DFFS) {
area: 1;
ff("IQ", "IQN") { clocked_on: CLK;
next_state: D;
- preset: "nSETZ'";
- clear: "nRSTZ'"; }
+ preset: "nSET'"; }
pin(CLK) { direction: input;
clock: true; }
pin(D) { direction: input; }
pin(Q) { direction: output;
function: "IQ"; }
- pin(nRSTZ) { direction: input; }
- pin(nSETZ) { direction: input; }
+ pin(nSET) { direction: input; }
+ }
+ cell(GP_DFFR) {
+ area: 1;
+ ff("IQ", "IQN") { clocked_on: CLK;
+ next_state: D;
+ clear: "nRST'"; }
+ pin(CLK) { direction: input;
+ clock: true; }
+ pin(D) { direction: input; }
+ pin(Q) { direction: output;
+ function: "IQ"; }
+ pin(nRST) { direction: input; }
}
}
diff --git a/techlibs/greenpak4/greenpak4_counters.cc b/techlibs/greenpak4/greenpak4_counters.cc
new file mode 100644
index 00000000..998bb73b
--- /dev/null
+++ b/techlibs/greenpak4/greenpak4_counters.cc
@@ -0,0 +1,442 @@
+/*
+ * yosys -- Yosys Open SYnthesis Suite
+ *
+ * Copyright (C) 2016 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/yosys.h"
+#include "kernel/sigtools.h"
+#include "kernel/modtools.h"
+
+USING_YOSYS_NAMESPACE
+PRIVATE_NAMESPACE_BEGIN
+
+//get the list of cells hooked up to at least one bit of a given net
+pool<Cell*> get_other_cells(const RTLIL::SigSpec& port, ModIndex& index, Cell* src)
+{
+ pool<Cell*> rval;
+ for(auto b : port)
+ {
+ pool<ModIndex::PortInfo> ports = index.query_ports(b);
+ for(auto x : ports)
+ {
+ if(x.cell == src)
+ continue;
+ rval.insert(x.cell);
+ }
+ }
+ return rval;
+}
+
+//return true if there is a full-width bus connection from cell a port ap to cell b port bp
+//if other_conns_allowed is false, then we require a strict point to point connection (no other links)
+bool is_full_bus(
+ const RTLIL::SigSpec& sig,
+ ModIndex& index,
+ Cell* a,
+ RTLIL::IdString ap,
+ Cell* b,
+ RTLIL::IdString bp,
+ bool other_conns_allowed = false)
+{
+ for(auto s : sig)
+ {
+ pool<ModIndex::PortInfo> ports = index.query_ports(s);
+ bool found_a = false;
+ bool found_b = false;
+ for(auto x : ports)
+ {
+ if( (x.cell == a) && (x.port == ap) )
+ found_a = true;
+ else if( (x.cell == b) && (x.port == bp) )
+ found_b = true;
+ else if(!other_conns_allowed)
+ return false;
+ }
+
+ if( (!found_a) || (!found_b) )
+ return false;
+ }
+
+ return true;
+}
+
+//return true if the signal connects to one port only (nothing on the other end)
+bool is_unconnected(const RTLIL::SigSpec& port, ModIndex& index)
+{
+ for(auto b : port)
+ {
+ pool<ModIndex::PortInfo> ports = index.query_ports(b);
+ if(ports.size() > 1)
+ return false;
+ }
+
+ return true;
+}
+
+struct CounterExtraction
+{
+ int width; //counter width
+ RTLIL::Wire* rwire; //the register output
+ bool has_reset; //true if we have a reset
+ RTLIL::SigSpec rst; //reset pin
+ int count_value; //value we count from
+ RTLIL::SigSpec clk; //clock signal
+ RTLIL::SigSpec outsig; //counter output signal
+ RTLIL::Cell* count_mux; //counter mux
+ RTLIL::Cell* count_reg; //counter register
+ RTLIL::Cell* underflow_inv; //inverter reduction for output-underflow detect
+};
+
+//attempt to extract a counter centered on the given cell
+int greenpak4_counters_tryextract(ModIndex& index, Cell *cell, CounterExtraction& extract)
+{
+ SigMap& sigmap = index.sigmap;
+
+ //GreenPak does not support counters larger than 14 bits so immediately skip anything bigger
+ int a_width = cell->getParam("\\A_WIDTH").as_int();
+ extract.width = a_width;
+ if(a_width > 14)
+ return 1;
+
+ //Second input must be a single bit
+ int b_width = cell->getParam("\\B_WIDTH").as_int();
+ if(b_width != 1)
+ return 2;
+
+ //Both inputs must be unsigned, so don't extract anything with a signed input
+ bool a_sign = cell->getParam("\\A_SIGNED").as_bool();
+ bool b_sign = cell->getParam("\\B_SIGNED").as_bool();
+ if(a_sign || b_sign)
+ return 3;
+
+ //To be a counter, one input of the ALU must be a constant 1
+ //TODO: can A or B be swapped in synthesized RTL or is B always the 1?
+ const RTLIL::SigSpec b_port = sigmap(cell->getPort("\\B"));
+ if(!b_port.is_fully_const() || (b_port.as_int() != 1) )
+ return 4;
+
+ //BI and CI must be constant 1 as well
+ const RTLIL::SigSpec bi_port = sigmap(cell->getPort("\\BI"));
+ if(!bi_port.is_fully_const() || (bi_port.as_int() != 1) )
+ return 5;
+ const RTLIL::SigSpec ci_port = sigmap(cell->getPort("\\CI"));
+ if(!ci_port.is_fully_const() || (ci_port.as_int() != 1) )
+ return 6;
+
+ //CO and X must be unconnected (exactly one connection to each port)
+ if(!is_unconnected(sigmap(cell->getPort("\\CO")), index))
+ return 7;
+ if(!is_unconnected(sigmap(cell->getPort("\\X")), index))
+ return 8;
+
+ //Y must have exactly one connection, and it has to be a $mux cell.
+ //We must have a direct bus connection from our Y to their A.
+ const RTLIL::SigSpec aluy = sigmap(cell->getPort("\\Y"));
+ pool<Cell*> y_loads = get_other_cells(aluy, index, cell);
+ if(y_loads.size() != 1)
+ return 9;
+ Cell* count_mux = *y_loads.begin();
+ extract.count_mux = count_mux;
+ if(count_mux->type != "$mux")
+ return 10;
+ if(!is_full_bus(aluy, index, cell, "\\Y", count_mux, "\\A"))
+ return 11;
+
+ //B connection of the mux is our underflow value
+ const RTLIL::SigSpec underflow = sigmap(count_mux->getPort("\\B"));
+ if(!underflow.is_fully_const())
+ return 12;
+ extract.count_value = underflow.as_int();
+
+ //S connection of the mux must come from an inverter (need not be the only load)
+ const RTLIL::SigSpec muxsel = sigmap(count_mux->getPort("\\S"));
+ extract.outsig = muxsel;
+ pool<Cell*> muxsel_conns = get_other_cells(muxsel, index, count_mux);
+ Cell* underflow_inv = NULL;
+ for(auto c : muxsel_conns)
+ {
+ if(c->type != "$logic_not")
+ continue;
+ if(!is_full_bus(muxsel, index, c, "\\Y", count_mux, "\\S", true))
+ continue;
+
+ underflow_inv = c;
+ break;
+ }
+ if(underflow_inv == NULL)
+ return 13;
+ extract.underflow_inv = underflow_inv;
+
+ //Y connection of the mux must have exactly one load, the counter's internal register
+ const RTLIL::SigSpec muxy = sigmap(count_mux->getPort("\\Y"));
+ pool<Cell*> muxy_loads = get_other_cells(muxy, index, count_mux);
+ if(muxy_loads.size() != 1)
+ return 14;
+ Cell* count_reg = *muxy_loads.begin();
+ extract.count_reg = count_reg;
+ if(count_reg->type == "$dff")
+ extract.has_reset = false;
+ else if(count_reg->type == "$adff")
+ {
+ extract.has_reset = true;
+
+ //Verify ARST_VALUE is zero and ARST_POLARITY is 1
+ //TODO: infer an inverter to make it 1 if necessary, so we can support negative level resets?
+ if(count_reg->getParam("\\ARST_POLARITY").as_int() != 1)
+ return 22;
+ if(count_reg->getParam("\\ARST_VALUE").as_int() != 0)
+ return 23;
+
+ //Save the reset
+ extract.rst = sigmap(count_reg->getPort("\\ARST"));
+ }
+ //TODO: support synchronous reset
+ else
+ return 15;
+ if(!is_full_bus(muxy, index, count_mux, "\\Y", count_reg, "\\D"))
+ return 16;
+
+ //TODO: Verify count_reg CLK_POLARITY is 1
+
+ //Register output must have exactly two loads, the inverter and ALU
+ const RTLIL::SigSpec cnout = sigmap(count_reg->getPort("\\Q"));
+ pool<Cell*> cnout_loads = get_other_cells(cnout, index, count_reg);
+ if(cnout_loads.size() != 2)
+ return 17;
+ if(!is_full_bus(cnout, index, count_reg, "\\Q", underflow_inv, "\\A", true))
+ return 18;
+ if(!is_full_bus(cnout, index, count_reg, "\\Q", cell, "\\A", true))
+ return 19;
+
+ //Look up the clock from the register
+ extract.clk = sigmap(count_reg->getPort("\\CLK"));
+
+ //Register output net must have an INIT attribute equal to the count value
+ extract.rwire = cnout.as_wire();
+ if(extract.rwire->attributes.find("\\init") == extract.rwire->attributes.end())
+ return 20;
+ int rinit = extract.rwire->attributes["\\init"].as_int();
+ if(rinit != extract.count_value)
+ return 21;
+
+ return 0;
+}
+
+void greenpak4_counters_worker(
+ ModIndex& index,
+ Cell *cell,
+ unsigned int& total_counters,
+ pool<Cell*>& cells_to_remove)
+{
+ SigMap& sigmap = index.sigmap;
+
+ //Core of the counter must be an ALU
+ if (cell->type != "$alu")
+ return;
+
+ //A input is the count value. Check if it has COUNT_EXTRACT set.
+ //If it's not a wire, don't even try
+ auto port = sigmap(cell->getPort("\\A"));
+ if(!port.is_wire())
+ return;
+ RTLIL::Wire* a_wire = port.as_wire();
+ bool force_extract = false;
+ bool never_extract = false;
+ string count_reg_src = a_wire->attributes["\\src"].decode_string().c_str();
+ if(a_wire->attributes.find("\\COUNT_EXTRACT") != a_wire->attributes.end())
+ {
+ pool<string> sa = a_wire->get_strpool_attribute("\\COUNT_EXTRACT");
+ string extract_value;
+ if(sa.size() >= 1)
+ {
+ extract_value = *sa.begin();
+ log(" Signal %s declared at %s has COUNT_EXTRACT = %s\n",
+ log_id(a_wire),
+ count_reg_src.c_str(),
+ extract_value.c_str());
+
+ if(extract_value == "FORCE")
+ force_extract = true;
+ else if(extract_value == "NO")
+ never_extract = true;
+ else if(extract_value == "AUTO")
+ {} //default
+ else
+ log_error(" Illegal COUNT_EXTRACT value %s (must be one of FORCE, NO, AUTO)\n",
+ extract_value.c_str());
+ }
+ }
+
+ //If we're explicitly told not to extract, don't infer a counter
+ if(never_extract)
+ return;
+
+ //Attempt to extract a counter
+ CounterExtraction extract;
+ int reason = greenpak4_counters_tryextract(index, cell, extract);
+
+ //Nonzero code - we could not find a matchable counter.
+ //Do nothing, unless extraction was forced in which case give an error
+ if(reason != 0)
+ {
+ static const char* reasons[24]=
+ {
+ "no problem", //0
+ "counter is larger than 14 bits", //1
+ "counter does not count by one", //2
+ "counter uses signed math", //3
+ "counter does not count by one", //4
+ "ALU is not a subtractor", //5
+ "ALU is not a subtractor", //6
+ "ALU ports used outside counter", //7
+ "ALU ports used outside counter", //8
+ "ALU output used outside counter", //9
+ "ALU output is not a mux", //10
+ "ALU output is not full bus", //11
+ "Underflow value is not constant", //12
+ "No underflow detector found", //13
+ "Mux output is used outside counter", //14
+ "Counter reg is not DFF/ADFF", //15
+ "Counter input is not full bus", //16
+ "Count register is used outside counter", //17
+ "Register output is not full bus", //18
+ "Register output is not full bus", //19
+ "No init value found", //20
+ "Underflow value is not equal to init value", //21
+ "Reset polarity is not positive", //22
+ "Reset is not to zero" //23
+ };
+
+ if(force_extract)
+ {
+ log_error(
+ "Counter extraction is set to FORCE on register %s, but a counter could not be inferred (%s)\n",
+ log_id(a_wire),
+ reasons[reason]);
+ }
+ return;
+ }
+
+ //Figure out the final cell type based on the counter size
+ string celltype = "\\GP_COUNT8";
+ if(extract.width > 8)
+ celltype = "\\GP_COUNT14";
+
+ //Log it
+ total_counters ++;
+ string reset_type = "non-resettable";
+ if(extract.has_reset)
+ {
+ //TODO: support other kind of reset
+ reset_type = "async resettable";
+ }
+ log(" Found %d-bit %s down counter (from %d) for register %s declared at %s\n",
+ extract.width,
+ reset_type.c_str(),
+ extract.count_value,
+ log_id(extract.rwire->name),
+ count_reg_src.c_str());
+
+ //Wipe all of the old connections to the ALU
+ cell->unsetPort("\\A");
+ cell->unsetPort("\\B");
+ cell->unsetPort("\\BI");
+ cell->unsetPort("\\CI");
+ cell->unsetPort("\\CO");
+ cell->unsetPort("\\X");
+ cell->unsetPort("\\Y");
+ cell->unsetParam("\\A_SIGNED");
+ cell->unsetParam("\\A_WIDTH");
+ cell->unsetParam("\\B_SIGNED");
+ cell->unsetParam("\\B_WIDTH");
+ cell->unsetParam("\\Y_WIDTH");
+
+ //Change the cell type
+ cell->type = celltype;
+
+ //Hook up resets
+ if(extract.has_reset)
+ {
+ //TODO: support other kinds of reset
+ cell->setParam("\\RESET_MODE", RTLIL::Const("LEVEL"));
+ cell->setPort("\\RST", extract.rst);
+ }
+ else
+ {
+ cell->setParam("\\RESET_MODE", RTLIL::Const("RISING"));
+ cell->setPort("\\RST", RTLIL::SigSpec(false));
+ }
+
+ //Hook up other stuff
+ cell->setParam("\\CLKIN_DIVIDE", RTLIL::Const(1));
+ cell->setParam("\\COUNT_TO", RTLIL::Const(extract.count_value));
+
+ cell->setPort("\\CLK", extract.clk);
+ cell->setPort("\\OUT", extract.outsig);
+
+ //Delete the cells we've replaced (let opt_clean handle deleting the now-redundant wires)
+ cells_to_remove.insert(extract.count_mux);
+ cells_to_remove.insert(extract.count_reg);
+ cells_to_remove.insert(extract.underflow_inv);
+}
+
+struct Greenpak4CountersPass : public Pass {
+ Greenpak4CountersPass() : Pass("greenpak4_counters", "Extract GreenPak4 counter cells") { }
+ virtual void help()
+ {
+ // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
+ log("\n");
+ log(" greenpak4_counters [options] [selection]\n");
+ log("\n");
+ log("This pass converts non-resettable or async resettable down counters to GreenPak4\n");
+ log("counter cells (All other GreenPak4 counter modes must be instantiated manually.)\n");
+ log("\n");
+ }
+ virtual void execute(std::vector<std::string> args, RTLIL::Design *design)
+ {
+ log_header(design, "Executing GREENPAK4_COUNTERS pass (mapping counters to hard IP blocks).\n");
+
+ size_t argidx;
+ for (argidx = 1; argidx < args.size(); argidx++)
+ {
+ // if (args[argidx] == "-v") {
+ // continue;
+ // }
+ break;
+ }
+ extra_args(args, argidx, design);
+
+ //Extract all of the counters we could find
+ unsigned int total_counters = 0;
+ for (auto module : design->selected_modules())
+ {
+ pool<Cell*> cells_to_remove;
+
+ ModIndex index(module);
+ for (auto cell : module->selected_cells())
+ greenpak4_counters_worker(index, cell, total_counters, cells_to_remove);
+
+ for(auto cell : cells_to_remove)
+ module->remove(cell);
+ }
+
+ if(total_counters)
+ log("Extracted %u counters\n", total_counters);
+ }
+} Greenpak4CountersPass;
+
+PRIVATE_NAMESPACE_END
diff --git a/techlibs/greenpak4/greenpak4_dffinv.cc b/techlibs/greenpak4/greenpak4_dffinv.cc
new file mode 100644
index 00000000..ff63958e
--- /dev/null
+++ b/techlibs/greenpak4/greenpak4_dffinv.cc
@@ -0,0 +1,197 @@
+/*
+ * 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/yosys.h"
+#include "kernel/sigtools.h"
+
+USING_YOSYS_NAMESPACE
+PRIVATE_NAMESPACE_BEGIN
+
+void invert_gp_dff(Cell *cell, bool invert_input)
+{
+ string cell_type = cell->type.str();
+ bool cell_type_i = cell_type.find('I') != string::npos;
+ bool cell_type_r = cell_type.find('R') != string::npos;
+ bool cell_type_s = cell_type.find('S') != string::npos;
+
+ if (!invert_input)
+ {
+ Const initval = cell->getParam("\\INIT");
+ if (GetSize(initval) >= 1) {
+ if (initval.bits[0] == State::S0)
+ initval.bits[0] = State::S1;
+ else if (initval.bits[0] == State::S1)
+ initval.bits[0] = State::S0;
+ cell->setParam("\\INIT", initval);
+ }
+
+ if (cell_type_r && cell_type_s)
+ {
+ Const srmode = cell->getParam("\\SRMODE");
+ if (GetSize(srmode) >= 1) {
+ if (srmode.bits[0] == State::S0)
+ srmode.bits[0] = State::S1;
+ else if (srmode.bits[0] == State::S1)
+ srmode.bits[0] = State::S0;
+ cell->setParam("\\SRMODE", srmode);
+ }
+ }
+ else
+ {
+ if (cell_type_r) {
+ cell->setPort("\\nSET", cell->getPort("\\nRST"));
+ cell->unsetPort("\\nRST");
+ cell_type_r = false;
+ cell_type_s = true;
+ } else
+ if (cell_type_s) {
+ cell->setPort("\\nRST", cell->getPort("\\nSET"));
+ cell->unsetPort("\\nSET");
+ cell_type_r = true;
+ cell_type_s = false;
+ }
+ }
+ }
+
+ if (cell_type_i) {
+ cell->setPort("\\Q", cell->getPort("\\nQ"));
+ cell->unsetPort("\\nQ");
+ cell_type_i = false;
+ } else {
+ cell->setPort("\\nQ", cell->getPort("\\Q"));
+ cell->unsetPort("\\Q");
+ cell_type_i = true;
+ }
+
+ cell->type = stringf("\\GP_DFF%s%s%s", cell_type_s ? "S" : "", cell_type_r ? "R" : "", cell_type_i ? "I" : "");
+
+ log("Merged %s inverter into cell %s.%s: %s -> %s\n", invert_input ? "input" : "output",
+ log_id(cell->module), log_id(cell), cell_type.c_str()+1, log_id(cell->type));
+}
+
+struct Greenpak4DffInvPass : public Pass {
+ Greenpak4DffInvPass() : Pass("greenpak4_dffinv", "merge greenpak4 inverters and DFFs") { }
+ virtual void help()
+ {
+ log("\n");
+ log(" greenpak4_dffinv [options] [selection]\n");
+ log("\n");
+ log("Merge GP_INV cells with GP_DFF* cells.\n");
+ log("\n");
+ }
+ virtual void execute(std::vector<std::string> args, RTLIL::Design *design)
+ {
+ log_header(design, "Executing GREENPAK4_DFFINV pass (merge synchronous set/reset into FF cells).\n");
+
+ size_t argidx;
+ for (argidx = 1; argidx < args.size(); argidx++)
+ {
+ // if (args[argidx] == "-singleton") {
+ // singleton_mode = true;
+ // continue;
+ // }
+ break;
+ }
+ extra_args(args, argidx, design);
+
+ pool<IdString> gp_dff_types;
+ gp_dff_types.insert("\\GP_DFF");
+ gp_dff_types.insert("\\GP_DFFI");
+ gp_dff_types.insert("\\GP_DFFR");
+ gp_dff_types.insert("\\GP_DFFRI");
+ gp_dff_types.insert("\\GP_DFFS");
+ gp_dff_types.insert("\\GP_DFFSI");
+ gp_dff_types.insert("\\GP_DFFSR");
+ gp_dff_types.insert("\\GP_DFFSRI");
+
+ for (auto module : design->selected_modules())
+ {
+ SigMap sigmap(module);
+ dict<SigBit, int> sig_use_cnt;
+ dict<SigBit, SigBit> inv_in2out, inv_out2in;
+ dict<SigBit, Cell*> inv_in2cell;
+ pool<Cell*> dff_cells;
+
+ for (auto wire : module->wires())
+ {
+ if (!wire->port_output)
+ continue;
+
+ for (auto bit : sigmap(wire))
+ sig_use_cnt[bit]++;
+ }
+
+ for (auto cell : module->cells())
+ for (auto &conn : cell->connections())
+ if (cell->input(conn.first) || !cell->known())
+ for (auto bit : sigmap(conn.second))
+ sig_use_cnt[bit]++;
+
+ for (auto cell : module->selected_cells())
+ {
+ if (gp_dff_types.count(cell->type)) {
+ dff_cells.insert(cell);
+ continue;
+ }
+
+ if (cell->type == "\\GP_INV") {
+ SigBit in_bit = sigmap(cell->getPort("\\IN"));
+ SigBit out_bit = sigmap(cell->getPort("\\OUT"));
+ inv_in2out[in_bit] = out_bit;
+ inv_out2in[out_bit] = in_bit;
+ inv_in2cell[in_bit] = cell;
+ continue;
+ }
+ }
+
+ for (auto cell : dff_cells)
+ {
+ SigBit d_bit = sigmap(cell->getPort("\\D"));
+ SigBit q_bit = sigmap(cell->hasPort("\\Q") ? cell->getPort("\\Q") : cell->getPort("\\nQ"));
+
+ while (inv_out2in.count(d_bit))
+ {
+ sig_use_cnt[d_bit]--;
+ invert_gp_dff(cell, true);
+ d_bit = inv_out2in.at(d_bit);
+ cell->setPort("\\D", d_bit);
+ sig_use_cnt[d_bit]++;
+ }
+
+ while (inv_in2out.count(q_bit) && sig_use_cnt[q_bit] == 1)
+ {
+ SigBit new_q_bit = inv_in2out.at(q_bit);
+ module->remove(inv_in2cell.at(q_bit));
+ sig_use_cnt.erase(q_bit);
+ inv_in2out.erase(q_bit);
+ inv_out2in.erase(new_q_bit);
+ inv_in2cell.erase(q_bit);
+
+ invert_gp_dff(cell, false);
+ if (cell->hasPort("\\Q"))
+ cell->setPort("\\Q", new_q_bit);
+ else
+ cell->setPort("\\nQ", new_q_bit);
+ }
+ }
+ }
+ }
+} Greenpak4DffInvPass;
+
+PRIVATE_NAMESPACE_END
diff --git a/techlibs/greenpak4/synth_greenpak4.cc b/techlibs/greenpak4/synth_greenpak4.cc
index 15b53d62..10e2a149 100644
--- a/techlibs/greenpak4/synth_greenpak4.cc
+++ b/techlibs/greenpak4/synth_greenpak4.cc
@@ -25,18 +25,11 @@
USING_YOSYS_NAMESPACE
PRIVATE_NAMESPACE_BEGIN
-bool check_label(bool &active, std::string run_from, std::string run_to, std::string label)
+struct SynthGreenPAK4Pass : public ScriptPass
{
- if (label == run_from)
- active = true;
- if (label == run_to)
- active = false;
- return active;
-}
-
-struct SynthGreenPAK4Pass : public Pass {
- SynthGreenPAK4Pass() : Pass("synth_greenpak4", "synthesis for GreenPAK4 FPGAs") { }
- virtual void help()
+ SynthGreenPAK4Pass() : ScriptPass("synth_greenpak4", "synthesis for GreenPAK4 FPGAs") { }
+
+ virtual void help() YS_OVERRIDE
{
// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
log("\n");
@@ -47,12 +40,12 @@ struct SynthGreenPAK4Pass : public Pass {
log(" -top <module>\n");
log(" use the specified module as top module (default='top')\n");
log("\n");
- log(" -blif <file>\n");
- log(" write the design to the specified BLIF file. writing of an output file\n");
- log(" is omitted if this parameter is not specified.\n");
+ log(" -part <part>\n");
+ log(" synthesize for the specified part. Valid values are SLG46140V,\n");
+ log(" SLG46620V, and SLG46621V (default).\n");
log("\n");
- log(" -edif <file>\n");
- log(" write the design to the specified edif file. writing of an output file\n");
+ log(" -json <file>\n");
+ log(" write the design to the specified JSON file. writing of an output file\n");
log(" is omitted if this parameter is not specified.\n");
log("\n");
log(" -run <from_label>:<to_label>\n");
@@ -68,55 +61,26 @@ struct SynthGreenPAK4Pass : public Pass {
log("\n");
log("\n");
log("The following commands are executed by this synthesis command:\n");
+ help_script();
log("\n");
- log(" begin:\n");
- log(" read_verilog -lib +/greenpak4/cells_sim.v\n");
- log(" hierarchy -check -top <top>\n");
- log("\n");
- log(" flatten: (unless -noflatten)\n");
- log(" proc\n");
- log(" flatten\n");
- log(" tribuf -logic\n");
- log("\n");
- log(" coarse:\n");
- log(" synth -run coarse\n");
- log("\n");
- log(" fine:\n");
- log(" opt -fast -mux_undef -undriven -fine\n");
- log(" memory_map\n");
- log(" opt -undriven -fine\n");
- log(" techmap\n");
- log(" dfflibmap -prepare -liberty +/greenpak4/gp_dff.lib\n");
- log(" opt -fast\n");
- log(" abc -dff (only if -retime)\n");
- log("\n");
- log(" map_luts:\n");
- log(" nlutmap -luts 0,8,16,2\n");
- log(" clean\n");
- log("\n");
- log(" map_cells:\n");
- log(" techmap -map +/greenpak4/cells_map.v\n");
- log(" clean\n");
- log("\n");
- log(" check:\n");
- log(" hierarchy -check\n");
- log(" stat\n");
- log(" check -noinit\n");
- log("\n");
- log(" blif:\n");
- log(" write_blif -gates -attr -param <file-name>\n");
- log("\n");
- log(" edif:\n");
- log(" write_edif <file-name>\n");
- log("\n");
}
- virtual void execute(std::vector<std::string> args, RTLIL::Design *design)
+
+ string top_opt, part, json_file;
+ bool flatten, retime;
+
+ virtual void clear_flags() YS_OVERRIDE
+ {
+ top_opt = "-auto-top";
+ part = "SLG46621V";
+ json_file = "";
+ flatten = true;
+ retime = false;
+ }
+
+ virtual void execute(std::vector<std::string> args, RTLIL::Design *design) YS_OVERRIDE
{
- std::string top_opt = "-auto-top";
- std::string run_from, run_to;
- std::string blif_file, edif_file;
- bool flatten = true;
- bool retime = false;
+ string run_from, run_to;
+ clear_flags();
size_t argidx;
for (argidx = 1; argidx < args.size(); argidx++)
@@ -125,12 +89,12 @@ struct SynthGreenPAK4Pass : public Pass {
top_opt = "-top " + args[++argidx];
continue;
}
- if (args[argidx] == "-blif" && argidx+1 < args.size()) {
- blif_file = args[++argidx];
+ if (args[argidx] == "-json" && argidx+1 < args.size()) {
+ json_file = args[++argidx];
continue;
}
- if (args[argidx] == "-edif" && argidx+1 < args.size()) {
- edif_file = args[++argidx];
+ if (args[argidx] == "-part" && argidx+1 < args.size()) {
+ part = args[++argidx];
continue;
}
if (args[argidx] == "-run" && argidx+1 < args.size()) {
@@ -141,10 +105,6 @@ struct SynthGreenPAK4Pass : public Pass {
run_to = args[argidx].substr(pos+1);
continue;
}
- if (args[argidx] == "-flatten") {
- flatten = true;
- continue;
- }
if (args[argidx] == "-noflatten") {
flatten = false;
continue;
@@ -160,70 +120,86 @@ struct SynthGreenPAK4Pass : public Pass {
if (!design->full_selection())
log_cmd_error("This comannd only operates on fully selected designs!\n");
- bool active = run_from.empty();
+ if (part != "SLG46140V" && part != "SLG46620V" && part != "SLG46621V")
+ log_cmd_error("Invalid part name: '%s'\n", part.c_str());
- log_header("Executing SYNTH_GREENPAK4 pass.\n");
+ log_header(design, "Executing SYNTH_GREENPAK4 pass.\n");
log_push();
- if (check_label(active, run_from, run_to, "begin"))
- {
- Pass::call(design, "read_verilog -lib +/greenpak4/cells_sim.v");
- Pass::call(design, stringf("hierarchy -check %s", top_opt.c_str()));
- }
+ run_script(design, run_from, run_to);
+
+ log_pop();
+ }
- if (flatten && check_label(active, run_from, run_to, "flatten"))
+ virtual void script() YS_OVERRIDE
+ {
+ if (check_label("begin"))
{
- Pass::call(design, "proc");
- Pass::call(design, "flatten");
- Pass::call(design, "tribuf -logic");
+ run("read_verilog -lib +/greenpak4/cells_sim.v");
+ run(stringf("hierarchy -check %s", help_mode ? "-top <top>" : top_opt.c_str()));
}
- if (check_label(active, run_from, run_to, "coarse"))
+ if (flatten && check_label("flatten", "(unless -noflatten)"))
{
- Pass::call(design, "synth -run coarse");
+ run("proc");
+ run("flatten");
+ run("tribuf -logic");
}
- if (check_label(active, run_from, run_to, "fine"))
+ if (check_label("coarse"))
{
- Pass::call(design, "opt -fast -mux_undef -undriven -fine");
- Pass::call(design, "memory_map");
- Pass::call(design, "opt -undriven -fine");
- Pass::call(design, "techmap");
- Pass::call(design, "dfflibmap -prepare -liberty +/greenpak4/gp_dff.lib");
- Pass::call(design, "opt -fast");
- if (retime)
- Pass::call(design, "abc -dff");
+ run("synth -run coarse");
}
- if (check_label(active, run_from, run_to, "map_luts"))
+ if (check_label("fine"))
{
- Pass::call(design, "nlutmap -luts 0,8,16,2");
- Pass::call(design, "clean");
+ run("greenpak4_counters");
+ run("clean");
+ run("opt -fast -mux_undef -undriven -fine");
+ run("memory_map");
+ run("opt -undriven -fine");
+ run("techmap");
+ run("dfflibmap -prepare -liberty +/greenpak4/gp_dff.lib");
+ run("opt -fast");
+ if (retime || help_mode)
+ run("abc -dff", "(only if -retime)");
}
- if (check_label(active, run_from, run_to, "map_cells"))
+ if (check_label("map_luts"))
{
- Pass::call(design, "techmap -map +/greenpak4/cells_map.v");
- Pass::call(design, "clean");
+ if (help_mode || part == "SLG46140V") run("nlutmap -assert -luts 0,6,8,2", " (for -part SLG46140V)");
+ if (help_mode || part == "SLG46620V") run("nlutmap -assert -luts 2,8,16,2", "(for -part SLG46620V)");
+ if (help_mode || part == "SLG46621V") run("nlutmap -assert -luts 2,8,16,2", "(for -part SLG46621V)");
+ run("clean");
}
- if (check_label(active, run_from, run_to, "check"))
+ if (check_label("map_cells"))
{
- Pass::call(design, "hierarchy -check");
- Pass::call(design, "stat");
- Pass::call(design, "check -noinit");
+ run("shregmap -tech greenpak4");
+ run("dfflibmap -liberty +/greenpak4/gp_dff.lib");
+ run("dffinit -ff GP_DFF Q INIT");
+ run("dffinit -ff GP_DFFR Q INIT");
+ run("dffinit -ff GP_DFFS Q INIT");
+ run("dffinit -ff GP_DFFSR Q INIT");
+ run("iopadmap -bits -inpad GP_IBUF OUT:IN -outpad GP_OBUF IN:OUT -inoutpad GP_OBUF OUT:IN -toutpad GP_OBUFT OE:IN:OUT -tinoutpad GP_IOBUF OE:OUT:IN:IO");
+ run("attrmvcp -attr src -attr LOC t:GP_OBUF t:GP_OBUFT t:GP_IOBUF n:*");
+ run("attrmvcp -attr src -attr LOC -driven t:GP_IBUF n:*");
+ run("techmap -map +/greenpak4/cells_map.v");
+ run("greenpak4_dffinv");
+ run("clean");
}
- if (check_label(active, run_from, run_to, "blif"))
+ if (check_label("check"))
{
- if (!blif_file.empty())
- Pass::call(design, stringf("write_blif -gates -attr -param %s", blif_file.c_str()));
+ run("hierarchy -check");
+ run("stat");
+ run("check -noinit");
}
- if (check_label(active, run_from, run_to, "edif"))
+ if (check_label("json"))
{
- if (!edif_file.empty())
- Pass::call(design, stringf("write_edif %s", edif_file.c_str()));
+ if (!json_file.empty() || help_mode)
+ run(stringf("write_json %s", help_mode ? "<file-name>" : json_file.c_str()));
}
log_pop();
diff --git a/techlibs/ice40/Makefile.inc b/techlibs/ice40/Makefile.inc
index 83009d17..14761c6c 100644
--- a/techlibs/ice40/Makefile.inc
+++ b/techlibs/ice40/Makefile.inc
@@ -23,6 +23,7 @@ techlibs/ice40/brams_init3.vh: techlibs/ice40/brams_init.mk
$(eval $(call add_share_file,share/ice40,techlibs/ice40/arith_map.v))
$(eval $(call add_share_file,share/ice40,techlibs/ice40/cells_map.v))
$(eval $(call add_share_file,share/ice40,techlibs/ice40/cells_sim.v))
+$(eval $(call add_share_file,share/ice40,techlibs/ice40/latches_map.v))
$(eval $(call add_share_file,share/ice40,techlibs/ice40/brams.txt))
$(eval $(call add_share_file,share/ice40,techlibs/ice40/brams_map.v))
diff --git a/techlibs/ice40/ice40_ffinit.cc b/techlibs/ice40/ice40_ffinit.cc
index 8c4b9a37..c914b20e 100644
--- a/techlibs/ice40/ice40_ffinit.cc
+++ b/techlibs/ice40/ice40_ffinit.cc
@@ -37,7 +37,7 @@ struct Ice40FfinitPass : public Pass {
}
virtual void execute(std::vector<std::string> args, RTLIL::Design *design)
{
- log_header("Executing ICE40_FFINIT pass (implement FF init values).\n");
+ log_header(design, "Executing ICE40_FFINIT pass (implement FF init values).\n");
size_t argidx;
for (argidx = 1; argidx < args.size(); argidx++)
@@ -57,6 +57,7 @@ struct Ice40FfinitPass : public Pass {
SigMap sigmap(module);
pool<Wire*> init_wires;
dict<SigBit, State> initbits;
+ dict<SigBit, SigBit> initbit_to_wire;
pool<SigBit> handled_initbits;
for (auto wire : module->selected_wires())
@@ -78,11 +79,14 @@ struct Ice40FfinitPass : public Pass {
if (initbits.count(bit)) {
if (initbits.at(bit) != val)
- log_error("Conflicting init values for signal %s.\n", log_signal(bit));
+ log_error("Conflicting init values for signal %s (%s = %s, %s = %s).\n",
+ log_signal(bit), log_signal(SigBit(wire, i)), log_signal(val),
+ log_signal(initbit_to_wire[bit]), log_signal(initbits.at(bit)));
continue;
}
initbits[bit] = val;
+ initbit_to_wire[bit] = SigBit(wire, i);
}
}
@@ -97,17 +101,23 @@ struct Ice40FfinitPass : public Pass {
if (!sb_dff_types.count(cell->type))
continue;
- SigBit sig_d = sigmap(cell->getPort("\\D"));
- SigBit sig_q = sigmap(cell->getPort("\\Q"));
+ SigSpec sig_d = cell->getPort("\\D");
+ SigSpec sig_q = cell->getPort("\\Q");
- if (!initbits.count(sig_q))
+ if (GetSize(sig_d) < 1 || GetSize(sig_q) < 1)
continue;
- State val = initbits.at(sig_q);
- handled_initbits.insert(sig_q);
+ SigBit bit_d = sigmap(sig_d[0]);
+ SigBit bit_q = sigmap(sig_q[0]);
+
+ if (!initbits.count(bit_q))
+ continue;
+
+ State val = initbits.at(bit_q);
+ handled_initbits.insert(bit_q);
log("FF init value for cell %s (%s): %s = %c\n", log_id(cell), log_id(cell->type),
- log_signal(sig_q), val != State::S0 ? '1' : '0');
+ log_signal(bit_q), val != State::S0 ? '1' : '0');
if (val == State::S0)
continue;
@@ -127,14 +137,14 @@ struct Ice40FfinitPass : public Pass {
cell->unsetPort("\\R");
}
- Wire *new_sig_d = module->addWire(NEW_ID);
- Wire *new_sig_q = module->addWire(NEW_ID);
+ Wire *new_bit_d = module->addWire(NEW_ID);
+ Wire *new_bit_q = module->addWire(NEW_ID);
- module->addNotGate(NEW_ID, sig_d, new_sig_d);
- module->addNotGate(NEW_ID, new_sig_q, sig_q);
+ module->addNotGate(NEW_ID, bit_d, new_bit_d);
+ module->addNotGate(NEW_ID, new_bit_q, bit_q);
- cell->setPort("\\D", new_sig_d);
- cell->setPort("\\Q", new_sig_q);
+ cell->setPort("\\D", new_bit_d);
+ cell->setPort("\\Q", new_bit_q);
}
for (auto wire : init_wires)
diff --git a/techlibs/ice40/ice40_ffssr.cc b/techlibs/ice40/ice40_ffssr.cc
index 9ebc3c0d..9afbc0fc 100644
--- a/techlibs/ice40/ice40_ffssr.cc
+++ b/techlibs/ice40/ice40_ffssr.cc
@@ -35,7 +35,7 @@ struct Ice40FfssrPass : public Pass {
}
virtual void execute(std::vector<std::string> args, RTLIL::Design *design)
{
- log_header("Executing ICE40_FFSSR pass (merge synchronous set/reset into FF cells).\n");
+ log_header(design, "Executing ICE40_FFSSR pass (merge synchronous set/reset into FF cells).\n");
size_t argidx;
for (argidx = 1; argidx < args.size(); argidx++)
@@ -81,7 +81,12 @@ struct Ice40FfssrPass : public Pass {
for (auto cell : ff_cells)
{
- SigBit bit_d = sigmap(cell->getPort("\\D"));
+ SigSpec sig_d = cell->getPort("\\D");
+
+ if (GetSize(sig_d) < 1)
+ continue;
+
+ SigBit bit_d = sigmap(sig_d[0]);
if (sr_muxes.count(bit_d) == 0)
continue;
diff --git a/techlibs/ice40/ice40_opt.cc b/techlibs/ice40/ice40_opt.cc
index 677ac8d7..ae72f5d6 100644
--- a/techlibs/ice40/ice40_opt.cc
+++ b/techlibs/ice40/ice40_opt.cc
@@ -26,7 +26,7 @@
USING_YOSYS_NAMESPACE
PRIVATE_NAMESPACE_BEGIN
-static void run_ice40_opts(Module *module)
+static void run_ice40_opts(Module *module, bool unlut_mode)
{
pool<SigBit> optimized_co;
vector<Cell*> sb_lut_cells;
@@ -84,6 +84,9 @@ static void run_ice40_opts(Module *module)
inbits.append(cell->getPort("\\I3"));
sigmap.apply(inbits);
+ if (unlut_mode)
+ goto remap_lut;
+
if (optimized_co.count(inbits[0])) goto remap_lut;
if (optimized_co.count(inbits[1])) goto remap_lut;
if (optimized_co.count(inbits[2])) goto remap_lut;
@@ -101,7 +104,7 @@ static void run_ice40_opts(Module *module)
cell->setParam("\\LUT", cell->getParam("\\LUT_INIT"));
cell->unsetParam("\\LUT_INIT");
- cell->setPort("\\A", SigSpec({cell->getPort("\\I0"), cell->getPort("\\I1"), cell->getPort("\\I2"), cell->getPort("\\I3")}));
+ cell->setPort("\\A", SigSpec({cell->getPort("\\I3"), cell->getPort("\\I2"), cell->getPort("\\I1"), cell->getPort("\\I0")}));
cell->setPort("\\Y", cell->getPort("\\O"));
cell->unsetPort("\\I0");
cell->unsetPort("\\I1");
@@ -127,23 +130,32 @@ struct Ice40OptPass : public Pass {
log("\n");
log(" do\n");
log(" <ice40 specific optimizations>\n");
- log(" opt_const -mux_undef -undriven [-full]\n");
- log(" opt_share\n");
+ log(" opt_expr -mux_undef -undriven [-full]\n");
+ log(" opt_merge\n");
log(" opt_rmdff\n");
log(" opt_clean\n");
log(" while <changed design>\n");
log("\n");
+ log("When called with the option -unlut, this command will transform all already\n");
+ log("mapped SB_LUT4 cells back to logic.\n");
+ log("\n");
}
virtual void execute(std::vector<std::string> args, RTLIL::Design *design)
{
- string opt_const_args = "-mux_undef -undriven";
- log_header("Executing ICE40_OPT pass (performing simple optimizations).\n");
+ string opt_expr_args = "-mux_undef -undriven";
+ bool unlut_mode = false;
+
+ log_header(design, "Executing ICE40_OPT pass (performing simple optimizations).\n");
log_push();
size_t argidx;
for (argidx = 1; argidx < args.size(); argidx++) {
if (args[argidx] == "-full") {
- opt_const_args += " -full";
+ opt_expr_args += " -full";
+ continue;
+ }
+ if (args[argidx] == "-unlut") {
+ unlut_mode = true;
continue;
}
break;
@@ -154,26 +166,26 @@ struct Ice40OptPass : public Pass {
{
design->scratchpad_unset("opt.did_something");
- log_header("Running ICE40 specific optimizations.\n");
+ log_header(design, "Running ICE40 specific optimizations.\n");
for (auto module : design->selected_modules())
- run_ice40_opts(module);
+ run_ice40_opts(module, unlut_mode);
- Pass::call(design, "opt_const " + opt_const_args);
- Pass::call(design, "opt_share");
+ Pass::call(design, "opt_expr " + opt_expr_args);
+ Pass::call(design, "opt_merge");
Pass::call(design, "opt_rmdff");
Pass::call(design, "opt_clean");
if (design->scratchpad_get_bool("opt.did_something") == false)
break;
- log_header("Rerunning OPT passes. (Removed registers in this run.)\n");
+ log_header(design, "Rerunning OPT passes. (Removed registers in this run.)\n");
}
design->optimize();
design->sort();
design->check();
- log_header("Finished OPT passes. (There is nothing left to do.)\n");
+ log_header(design, "Finished OPT passes. (There is nothing left to do.)\n");
log_pop();
}
} Ice40OptPass;
diff --git a/techlibs/ice40/latches_map.v b/techlibs/ice40/latches_map.v
new file mode 100644
index 00000000..c28f88cf
--- /dev/null
+++ b/techlibs/ice40/latches_map.v
@@ -0,0 +1,11 @@
+module \$_DLATCH_N_ (E, D, Q);
+ wire [1023:0] _TECHMAP_DO_ = "simplemap; opt";
+ input E, D;
+ output Q = !E ? D : Q;
+endmodule
+
+module \$_DLATCH_P_ (E, D, Q);
+ wire [1023:0] _TECHMAP_DO_ = "simplemap; opt";
+ input E, D;
+ output Q = E ? D : Q;
+endmodule
diff --git a/techlibs/ice40/synth_ice40.cc b/techlibs/ice40/synth_ice40.cc
index 92d53f4a..38a9cf9d 100644
--- a/techlibs/ice40/synth_ice40.cc
+++ b/techlibs/ice40/synth_ice40.cc
@@ -25,18 +25,11 @@
USING_YOSYS_NAMESPACE
PRIVATE_NAMESPACE_BEGIN
-bool check_label(bool &active, std::string run_from, std::string run_to, std::string label)
+struct SynthIce40Pass : public ScriptPass
{
- if (label == run_from)
- active = true;
- if (label == run_to)
- active = false;
- return active;
-}
+ SynthIce40Pass() : ScriptPass("synth_ice40", "synthesis for iCE40 FPGAs") { }
-struct SynthIce40Pass : public Pass {
- SynthIce40Pass() : Pass("synth_ice40", "synthesis for iCE40 FPGAs") { }
- virtual void help()
+ virtual void help() YS_OVERRIDE
{
// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
log("\n");
@@ -77,73 +70,29 @@ struct SynthIce40Pass : public Pass {
log("\n");
log("\n");
log("The following commands are executed by this synthesis command:\n");
+ help_script();
log("\n");
- log(" begin:\n");
- log(" read_verilog -lib +/ice40/cells_sim.v\n");
- log(" hierarchy -check -top <top>\n");
- log("\n");
- log(" flatten: (unless -noflatten)\n");
- log(" proc\n");
- log(" flatten\n");
- log(" tribuf -logic\n");
- log("\n");
- log(" coarse:\n");
- log(" synth -run coarse\n");
- log("\n");
- log(" bram: (skip if -nobram)\n");
- log(" memory_bram -rules +/ice40/brams.txt\n");
- log(" techmap -map +/ice40/brams_map.v\n");
- log("\n");
- log(" fine:\n");
- log(" opt -fast -mux_undef -undriven -fine\n");
- log(" memory_map\n");
- log(" opt -undriven -fine\n");
- log(" techmap -map +/techmap.v [-map +/ice40/arith_map.v]\n");
- log(" abc -dff (only if -retime)\n");
- log(" ice40_opt\n");
- log("\n");
- log(" map_ffs:\n");
- log(" dffsr2dff\n");
- log(" dff2dffe -direct-match $_DFF_*\n");
- log(" techmap -map +/ice40/cells_map.v\n");
- log(" opt_const -mux_undef\n");
- log(" simplemap\n");
- log(" ice40_ffinit\n");
- log(" ice40_ffssr\n");
- log(" ice40_opt -full\n");
- log("\n");
- log(" map_luts:\n");
- log(" abc (only if -abc2)\n");
- log(" ice40_opt (only if -abc2)\n");
- log(" abc -lut 4\n");
- log(" clean\n");
- log("\n");
- log(" map_cells:\n");
- log(" techmap -map +/ice40/cells_map.v\n");
- log(" clean\n");
- log("\n");
- log(" check:\n");
- log(" hierarchy -check\n");
- log(" stat\n");
- log(" check -noinit\n");
- log("\n");
- log(" blif:\n");
- log(" write_blif -gates -attr -param <file-name>\n");
- log("\n");
- log(" edif:\n");
- log(" write_edif <file-name>\n");
- log("\n");
}
- virtual void execute(std::vector<std::string> args, RTLIL::Design *design)
+
+ string top_opt, blif_file, edif_file;
+ bool nocarry, nobram, flatten, retime, abc2;
+
+ virtual void clear_flags() YS_OVERRIDE
+ {
+ top_opt = "-auto-top";
+ blif_file = "";
+ edif_file = "";
+ nocarry = false;
+ nobram = false;
+ flatten = true;
+ retime = false;
+ abc2 = false;
+ }
+
+ virtual void execute(std::vector<std::string> args, RTLIL::Design *design) YS_OVERRIDE
{
- std::string top_opt = "-auto-top";
- std::string run_from, run_to;
- std::string blif_file, edif_file;
- bool nocarry = false;
- bool nobram = false;
- bool flatten = true;
- bool retime = false;
- bool abc2 = false;
+ string run_from, run_to;
+ clear_flags();
size_t argidx;
for (argidx = 1; argidx < args.size(); argidx++)
@@ -199,97 +148,102 @@ struct SynthIce40Pass : public Pass {
if (!design->full_selection())
log_cmd_error("This comannd only operates on fully selected designs!\n");
- bool active = run_from.empty();
-
- log_header("Executing SYNTH_ICE40 pass.\n");
+ log_header(design, "Executing SYNTH_ICE40 pass.\n");
log_push();
- if (check_label(active, run_from, run_to, "begin"))
+ run_script(design, run_from, run_to);
+
+ log_pop();
+ }
+
+ virtual void script() YS_OVERRIDE
+ {
+ if (check_label("begin"))
{
- Pass::call(design, "read_verilog -lib +/ice40/cells_sim.v");
- Pass::call(design, stringf("hierarchy -check %s", top_opt.c_str()));
+ run("read_verilog -lib +/ice40/cells_sim.v");
+ run(stringf("hierarchy -check %s", help_mode ? "-top <top>" : top_opt.c_str()));
}
- if (flatten && check_label(active, run_from, run_to, "flatten"))
+ if (flatten && check_label("flatten", "(unless -noflatten)"))
{
- Pass::call(design, "proc");
- Pass::call(design, "flatten");
- Pass::call(design, "tribuf -logic");
+ run("proc");
+ run("flatten");
+ run("tribuf -logic");
+ run("deminout");
}
- if (check_label(active, run_from, run_to, "coarse"))
+ if (check_label("coarse"))
{
- Pass::call(design, "synth -run coarse");
+ run("synth -run coarse");
}
- if (!nobram && check_label(active, run_from, run_to, "bram"))
+ if (!nobram && check_label("bram", "(skip if -nobram)"))
{
- Pass::call(design, "memory_bram -rules +/ice40/brams.txt");
- Pass::call(design, "techmap -map +/ice40/brams_map.v");
+ run("memory_bram -rules +/ice40/brams.txt");
+ run("techmap -map +/ice40/brams_map.v");
}
- if (check_label(active, run_from, run_to, "fine"))
+ if (check_label("fine"))
{
- Pass::call(design, "opt -fast -mux_undef -undriven -fine");
- Pass::call(design, "memory_map");
- Pass::call(design, "opt -undriven -fine");
+ run("opt -fast -mux_undef -undriven -fine");
+ run("memory_map");
+ run("opt -undriven -fine");
if (nocarry)
- Pass::call(design, "techmap");
+ run("techmap");
else
- Pass::call(design, "techmap -map +/techmap.v -map +/ice40/arith_map.v");
- if (retime)
- Pass::call(design, "abc -dff");
- Pass::call(design, "ice40_opt");
+ run("techmap -map +/techmap.v -map +/ice40/arith_map.v");
+ if (retime || help_mode)
+ run("abc -dff", "(only if -retime)");
+ run("ice40_opt");
}
- if (check_label(active, run_from, run_to, "map_ffs"))
+ if (check_label("map_ffs"))
{
- Pass::call(design, "dffsr2dff");
- Pass::call(design, "dff2dffe -direct-match $_DFF_*");
- Pass::call(design, "techmap -map +/ice40/cells_map.v");
- Pass::call(design, "opt_const -mux_undef");
- Pass::call(design, "simplemap");
- Pass::call(design, "ice40_ffinit");
- Pass::call(design, "ice40_ffssr");
- Pass::call(design, "ice40_opt -full");
+ run("dffsr2dff");
+ run("dff2dffe -direct-match $_DFF_*");
+ run("techmap -map +/ice40/cells_map.v");
+ run("opt_expr -mux_undef");
+ run("simplemap");
+ run("ice40_ffinit");
+ run("ice40_ffssr");
+ run("ice40_opt -full");
}
- if (check_label(active, run_from, run_to, "map_luts"))
+ if (check_label("map_luts"))
{
- if (abc2) {
- Pass::call(design, "abc");
- Pass::call(design, "ice40_opt");
+ if (abc2 || help_mode) {
+ run("abc", " (only if -abc2)");
+ run("ice40_opt", "(only if -abc2)");
}
- Pass::call(design, "abc -lut 4");
- Pass::call(design, "clean");
+ run("techmap -map +/ice40/latches_map.v");
+ run("abc -lut 4");
+ run("clean");
}
- if (check_label(active, run_from, run_to, "map_cells"))
+ if (check_label("map_cells"))
{
- Pass::call(design, "techmap -map +/ice40/cells_map.v");
- Pass::call(design, "clean");
+ run("techmap -map +/ice40/cells_map.v");
+ run("clean");
}
- if (check_label(active, run_from, run_to, "check"))
+ if (check_label("check"))
{
- Pass::call(design, "hierarchy -check");
- Pass::call(design, "stat");
- Pass::call(design, "check -noinit");
+ run("hierarchy -check");
+ run("stat");
+ run("check -noinit");
}
- if (check_label(active, run_from, run_to, "blif"))
+ if (check_label("blif"))
{
- if (!blif_file.empty())
- Pass::call(design, stringf("write_blif -gates -attr -param %s", blif_file.c_str()));
+ if (!blif_file.empty() || help_mode)
+ run(stringf("write_blif -gates -attr -param %s", help_mode ? "<file-name>" : blif_file.c_str()));
}
- if (check_label(active, run_from, run_to, "edif"))
+ if (check_label("edif"))
{
- if (!edif_file.empty())
- Pass::call(design, stringf("write_edif %s", edif_file.c_str()));
+ if (!edif_file.empty() || help_mode)
+ run(stringf("write_edif %s", help_mode ? "<file-name>" : edif_file.c_str()));
}
-
- log_pop();
}
} SynthIce40Pass;
diff --git a/techlibs/xilinx/Makefile.inc b/techlibs/xilinx/Makefile.inc
index ccf88ec7..5f09ffb0 100644
--- a/techlibs/xilinx/Makefile.inc
+++ b/techlibs/xilinx/Makefile.inc
@@ -21,6 +21,7 @@ techlibs/xilinx/brams_init_16.vh: techlibs/xilinx/brams_init.mk
$(eval $(call add_share_file,share/xilinx,techlibs/xilinx/cells_map.v))
$(eval $(call add_share_file,share/xilinx,techlibs/xilinx/cells_sim.v))
+$(eval $(call add_share_file,share/xilinx,techlibs/xilinx/cells_xtra.v))
$(eval $(call add_share_file,share/xilinx,techlibs/xilinx/brams.txt))
$(eval $(call add_share_file,share/xilinx,techlibs/xilinx/brams_map.v))
$(eval $(call add_share_file,share/xilinx,techlibs/xilinx/brams_bb.v))
diff --git a/techlibs/xilinx/cells_xtra.sh b/techlibs/xilinx/cells_xtra.sh
new file mode 100644
index 00000000..c7ad1604
--- /dev/null
+++ b/techlibs/xilinx/cells_xtra.sh
@@ -0,0 +1,145 @@
+#!/bin/bash
+
+set -e
+libdir="/opt/Xilinx/Vivado/2015.4/data/verilog/src"
+
+function xtract_cell_decl()
+{
+ for dir in $libdir/xeclib $libdir/retarget; do
+ [ -f $dir/$1.v ] || continue
+ egrep '^\s*((end)?module|parameter|input|output|(end)?function|(end)?task)' $dir/$1.v |
+ sed -re '/UNPLACED/ d; /^\s*function/,/endfunction/ d; /^\s*task/,/endtask/ d;
+ s,//.*,,; s/#?\(.*/(...);/; s/^(input|output|parameter)/ \1/;
+ s/\s+$//; s/,$/;/; /input|output|parameter/ s/[^;]$/&;/; s/\s+/ /g;
+ s/^ ((end)?module)/\1/; s/^ / /; /module.*_bb/,/endmodule/ d;'
+ echo; return
+ done
+ echo "Can't find $1."
+ exit 1
+}
+
+{
+ echo "// Created by cells_xtra.sh from Xilinx models"
+ echo
+
+ # Design elements types listed in Xilinx UG953
+ xtract_cell_decl BSCANE2
+ # xtract_cell_decl BUFG
+ xtract_cell_decl BUFGCE
+ xtract_cell_decl BUFGCE_1
+ xtract_cell_decl BUFGCTRL
+ xtract_cell_decl BUFGMUX
+ xtract_cell_decl BUFGMUX_1
+ xtract_cell_decl BUFGMUX_CTRL
+ xtract_cell_decl BUFH
+ xtract_cell_decl BUFHCE
+ xtract_cell_decl BUFIO
+ xtract_cell_decl BUFMR
+ xtract_cell_decl BUFMRCE
+ xtract_cell_decl BUFR
+ xtract_cell_decl CAPTUREE2
+ # xtract_cell_decl CARRY4
+ xtract_cell_decl CFGLUT5
+ xtract_cell_decl DCIRESET
+ xtract_cell_decl DNA_PORT
+ xtract_cell_decl DSP48E1
+ xtract_cell_decl EFUSE_USR
+ # xtract_cell_decl FDCE
+ # xtract_cell_decl FDPE
+ # xtract_cell_decl FDRE
+ # xtract_cell_decl FDSE
+ xtract_cell_decl FIFO18E1
+ xtract_cell_decl FIFO36E1
+ xtract_cell_decl FRAME_ECCE2
+ xtract_cell_decl GTHE2_CHANNEL
+ xtract_cell_decl GTHE2_COMMON
+ xtract_cell_decl GTPE2_CHANNEL
+ xtract_cell_decl GTPE2_COMMON
+ xtract_cell_decl GTXE2_CHANNEL
+ xtract_cell_decl GTXE2_COMMON
+ # xtract_cell_decl IBUF
+ xtract_cell_decl IBUF_IBUFDISABLE
+ xtract_cell_decl IBUF_INTERMDISABLE
+ xtract_cell_decl IBUFDS
+ xtract_cell_decl IBUFDS_DIFF_OUT
+ xtract_cell_decl IBUFDS_DIFF_OUT_IBUFDISABLE
+ xtract_cell_decl IBUFDS_DIFF_OUT_INTERMDISABLE
+ xtract_cell_decl IBUFDS_GTE2
+ xtract_cell_decl IBUFDS_IBUFDISABLE
+ xtract_cell_decl IBUFDS_INTERMDISABLE
+ xtract_cell_decl ICAPE2
+ xtract_cell_decl IDDR
+ xtract_cell_decl IDDR_2CLK
+ xtract_cell_decl IDELAYCTRL
+ xtract_cell_decl IDELAYE2
+ xtract_cell_decl IN_FIFO
+ xtract_cell_decl IOBUF
+ xtract_cell_decl IOBUF_DCIEN
+ xtract_cell_decl IOBUF_INTERMDISABLE
+ xtract_cell_decl IOBUFDS
+ xtract_cell_decl IOBUFDS_DCIEN
+ xtract_cell_decl IOBUFDS_DIFF_OUT
+ xtract_cell_decl IOBUFDS_DIFF_OUT_DCIEN
+ xtract_cell_decl IOBUFDS_DIFF_OUT_INTERMDISABLE
+ xtract_cell_decl ISERDESE2
+ xtract_cell_decl KEEPER
+ xtract_cell_decl LDCE
+ xtract_cell_decl LDPE
+ # xtract_cell_decl LUT1
+ # xtract_cell_decl LUT2
+ # xtract_cell_decl LUT3
+ # xtract_cell_decl LUT4
+ # xtract_cell_decl LUT5
+ # xtract_cell_decl LUT6
+ xtract_cell_decl LUT6_2
+ xtract_cell_decl MMCME2_ADV
+ xtract_cell_decl MMCME2_BASE
+ # xtract_cell_decl MUXF7
+ # xtract_cell_decl MUXF8
+ # xtract_cell_decl OBUF
+ xtract_cell_decl OBUFDS
+ xtract_cell_decl OBUFT
+ xtract_cell_decl OBUFTDS
+ xtract_cell_decl ODDR
+ xtract_cell_decl ODELAYE2
+ xtract_cell_decl OSERDESE2
+ xtract_cell_decl OUT_FIFO
+ xtract_cell_decl PHASER_IN
+ xtract_cell_decl PHASER_IN_PHY
+ xtract_cell_decl PHASER_OUT
+ xtract_cell_decl PHASER_OUT_PHY
+ xtract_cell_decl PHASER_REF
+ xtract_cell_decl PHY_CONTROL
+ xtract_cell_decl PLLE2_ADV
+ xtract_cell_decl PLLE2_BASE
+ xtract_cell_decl PULLDOWN
+ xtract_cell_decl PULLUP
+ # xtract_cell_decl RAM128X1D
+ xtract_cell_decl RAM128X1S
+ xtract_cell_decl RAM256X1S
+ xtract_cell_decl RAM32M
+ xtract_cell_decl RAM32X1D
+ xtract_cell_decl RAM32X1S
+ xtract_cell_decl RAM32X1S_1
+ xtract_cell_decl RAM32X2S
+ xtract_cell_decl RAM64M
+ # xtract_cell_decl RAM64X1D
+ xtract_cell_decl RAM64X1S
+ xtract_cell_decl RAM64X1S_1
+ xtract_cell_decl RAM64X2S
+ # xtract_cell_decl RAMB18E1
+ # xtract_cell_decl RAMB36E1
+ xtract_cell_decl ROM128X1
+ xtract_cell_decl ROM256X1
+ xtract_cell_decl ROM32X1
+ xtract_cell_decl ROM64X1
+ xtract_cell_decl SRL16E
+ xtract_cell_decl SRLC32E
+ xtract_cell_decl STARTUPE2
+ xtract_cell_decl USR_ACCESSE2
+ xtract_cell_decl XADC
+} > cells_xtra.new
+
+mv cells_xtra.new cells_xtra.v
+exit 0
+
diff --git a/techlibs/xilinx/cells_xtra.v b/techlibs/xilinx/cells_xtra.v
new file mode 100644
index 00000000..a2dd01ad
--- /dev/null
+++ b/techlibs/xilinx/cells_xtra.v
@@ -0,0 +1,3293 @@
+// Created by cells_xtra.sh from Xilinx models
+
+module BSCANE2 (...);
+ parameter DISABLE_JTAG = "FALSE";
+ parameter integer JTAG_CHAIN = 1;
+ output CAPTURE;
+ output DRCK;
+ output RESET;
+ output RUNTEST;
+ output SEL;
+ output SHIFT;
+ output TCK;
+ output TDI;
+ output TMS;
+ output UPDATE;
+ input TDO;
+endmodule
+
+module BUFGCE (...);
+ parameter CE_TYPE = "SYNC";
+ parameter [0:0] IS_CE_INVERTED = 1'b0;
+ parameter [0:0] IS_I_INVERTED = 1'b0;
+ output O;
+ input CE;
+ input I;
+endmodule
+
+module BUFGCE_1 (...);
+ output O;
+ input CE, I;
+endmodule
+
+module BUFGCTRL (...);
+ output O;
+ input CE0;
+ input CE1;
+ input I0;
+ input I1;
+ input IGNORE0;
+ input IGNORE1;
+ input S0;
+ input S1;
+ parameter integer INIT_OUT = 0;
+ parameter PRESELECT_I0 = "FALSE";
+ parameter PRESELECT_I1 = "FALSE";
+ parameter [0:0] IS_CE0_INVERTED = 1'b0;
+ parameter [0:0] IS_CE1_INVERTED = 1'b0;
+ parameter [0:0] IS_I0_INVERTED = 1'b0;
+ parameter [0:0] IS_I1_INVERTED = 1'b0;
+ parameter [0:0] IS_IGNORE0_INVERTED = 1'b0;
+ parameter [0:0] IS_IGNORE1_INVERTED = 1'b0;
+ parameter [0:0] IS_S0_INVERTED = 1'b0;
+ parameter [0:0] IS_S1_INVERTED = 1'b0;
+endmodule
+
+module BUFGMUX (...);
+ parameter CLK_SEL_TYPE = "SYNC";
+ output O;
+ input I0, I1, S;
+endmodule
+
+module BUFGMUX_1 (...);
+ parameter CLK_SEL_TYPE = "SYNC";
+ output O;
+ input I0, I1, S;
+endmodule
+
+module BUFGMUX_CTRL (...);
+ output O;
+ input I0;
+ input I1;
+ input S;
+endmodule
+
+module BUFH (...);
+ output O;
+ input I;
+endmodule
+
+module BUFHCE (...);
+ parameter CE_TYPE = "SYNC";
+ parameter integer INIT_OUT = 0;
+ parameter [0:0] IS_CE_INVERTED = 1'b0;
+ output O;
+ input CE;
+ input I;
+endmodule
+
+module BUFIO (...);
+ output O;
+ input I;
+endmodule
+
+module BUFMR (...);
+ output O;
+ input I;
+endmodule
+
+module BUFMRCE (...);
+ parameter CE_TYPE = "SYNC";
+ parameter integer INIT_OUT = 0;
+ parameter [0:0] IS_CE_INVERTED = 1'b0;
+ output O;
+ input CE;
+ input I;
+endmodule
+
+module BUFR (...);
+ output O;
+ input CE;
+ input CLR;
+ input I;
+ parameter BUFR_DIVIDE = "BYPASS";
+ parameter SIM_DEVICE = "7SERIES";
+endmodule
+
+module CAPTUREE2 (...);
+ parameter ONESHOT = "TRUE";
+ input CAP;
+ input CLK;
+endmodule
+
+module CFGLUT5 (...);
+ parameter [31:0] INIT = 32'h00000000;
+ parameter [0:0] IS_CLK_INVERTED = 1'b0;
+ output CDO;
+ output O5;
+ output O6;
+ input I4, I3, I2, I1, I0;
+ input CDI, CE, CLK;
+endmodule
+
+module DCIRESET (...);
+ output LOCKED;
+ input RST;
+endmodule
+
+module DNA_PORT (...);
+ parameter [56:0] SIM_DNA_VALUE = 57'h0;
+ output DOUT;
+ input CLK, DIN, READ, SHIFT;
+endmodule
+
+module DSP48E1 (...);
+ parameter integer ACASCREG = 1;
+ parameter integer ADREG = 1;
+ parameter integer ALUMODEREG = 1;
+ parameter integer AREG = 1;
+ parameter AUTORESET_PATDET = "NO_RESET";
+ parameter A_INPUT = "DIRECT";
+ parameter integer BCASCREG = 1;
+ parameter integer BREG = 1;
+ parameter B_INPUT = "DIRECT";
+ parameter integer CARRYINREG = 1;
+ parameter integer CARRYINSELREG = 1;
+ parameter integer CREG = 1;
+ parameter integer DREG = 1;
+ parameter integer INMODEREG = 1;
+ parameter integer MREG = 1;
+ parameter integer OPMODEREG = 1;
+ parameter integer PREG = 1;
+ parameter SEL_MASK = "MASK";
+ parameter SEL_PATTERN = "PATTERN";
+ parameter USE_DPORT = "FALSE";
+ parameter USE_MULT = "MULTIPLY";
+ parameter USE_PATTERN_DETECT = "NO_PATDET";
+ parameter USE_SIMD = "ONE48";
+ parameter [47:0] MASK = 48'h3FFFFFFFFFFF;
+ parameter [47:0] PATTERN = 48'h000000000000;
+ parameter [3:0] IS_ALUMODE_INVERTED = 4'b0;
+ parameter [0:0] IS_CARRYIN_INVERTED = 1'b0;
+ parameter [0:0] IS_CLK_INVERTED = 1'b0;
+ parameter [4:0] IS_INMODE_INVERTED = 5'b0;
+ parameter [6:0] IS_OPMODE_INVERTED = 7'b0;
+ output [29:0] ACOUT;
+ output [17:0] BCOUT;
+ output CARRYCASCOUT;
+ output [3:0] CARRYOUT;
+ output MULTSIGNOUT;
+ output OVERFLOW;
+ output [47:0] P;
+ output PATTERNBDETECT;
+ output PATTERNDETECT;
+ output [47:0] PCOUT;
+ output UNDERFLOW;
+ input [29:0] A;
+ input [29:0] ACIN;
+ input [3:0] ALUMODE;
+ input [17:0] B;
+ input [17:0] BCIN;
+ input [47:0] C;
+ input CARRYCASCIN;
+ input CARRYIN;
+ input [2:0] CARRYINSEL;
+ input CEA1;
+ input CEA2;
+ input CEAD;
+ input CEALUMODE;
+ input CEB1;
+ input CEB2;
+ input CEC;
+ input CECARRYIN;
+ input CECTRL;
+ input CED;
+ input CEINMODE;
+ input CEM;
+ input CEP;
+ input CLK;
+ input [24:0] D;
+ input [4:0] INMODE;
+ input MULTSIGNIN;
+ input [6:0] OPMODE;
+ input [47:0] PCIN;
+ input RSTA;
+ input RSTALLCARRYIN;
+ input RSTALUMODE;
+ input RSTB;
+ input RSTC;
+ input RSTCTRL;
+ input RSTD;
+ input RSTINMODE;
+ input RSTM;
+ input RSTP;
+endmodule
+
+module EFUSE_USR (...);
+ parameter [31:0] SIM_EFUSE_VALUE = 32'h00000000;
+ output [31:0] EFUSEUSR;
+endmodule
+
+module FIFO18E1 (...);
+ parameter ALMOST_EMPTY_OFFSET = 13'h0080;
+ parameter ALMOST_FULL_OFFSET = 13'h0080;
+ parameter integer DATA_WIDTH = 4;
+ parameter integer DO_REG = 1;
+ parameter EN_SYN = "FALSE";
+ parameter FIFO_MODE = "FIFO18";
+ parameter FIRST_WORD_FALL_THROUGH = "FALSE";
+ parameter INIT = 36'h0;
+ parameter SIM_DEVICE = "VIRTEX6";
+ parameter SRVAL = 36'h0;
+ parameter IS_RDCLK_INVERTED = 1'b0;
+ parameter IS_RDEN_INVERTED = 1'b0;
+ parameter IS_RSTREG_INVERTED = 1'b0;
+ parameter IS_RST_INVERTED = 1'b0;
+ parameter IS_WRCLK_INVERTED = 1'b0;
+ parameter IS_WREN_INVERTED = 1'b0;
+ output ALMOSTEMPTY;
+ output ALMOSTFULL;
+ output [31:0] DO;
+ output [3:0] DOP;
+ output EMPTY;
+ output FULL;
+ output [11:0] RDCOUNT;
+ output RDERR;
+ output [11:0] WRCOUNT;
+ output WRERR;
+ input [31:0] DI;
+ input [3:0] DIP;
+ input RDCLK;
+ input RDEN;
+ input REGCE;
+ input RST;
+ input RSTREG;
+ input WRCLK;
+ input WREN;
+endmodule
+
+module FIFO36E1 (...);
+ parameter ALMOST_EMPTY_OFFSET = 13'h0080;
+ parameter ALMOST_FULL_OFFSET = 13'h0080;
+ parameter integer DATA_WIDTH = 4;
+ parameter integer DO_REG = 1;
+ parameter EN_ECC_READ = "FALSE";
+ parameter EN_ECC_WRITE = "FALSE";
+ parameter EN_SYN = "FALSE";
+ parameter FIFO_MODE = "FIFO36";
+ parameter FIRST_WORD_FALL_THROUGH = "FALSE";
+ parameter INIT = 72'h0;
+ parameter SIM_DEVICE = "VIRTEX6";
+ parameter SRVAL = 72'h0;
+ parameter IS_RDCLK_INVERTED = 1'b0;
+ parameter IS_RDEN_INVERTED = 1'b0;
+ parameter IS_RSTREG_INVERTED = 1'b0;
+ parameter IS_RST_INVERTED = 1'b0;
+ parameter IS_WRCLK_INVERTED = 1'b0;
+ parameter IS_WREN_INVERTED = 1'b0;
+ output ALMOSTEMPTY;
+ output ALMOSTFULL;
+ output DBITERR;
+ output [63:0] DO;
+ output [7:0] DOP;
+ output [7:0] ECCPARITY;
+ output EMPTY;
+ output FULL;
+ output [12:0] RDCOUNT;
+ output RDERR;
+ output SBITERR;
+ output [12:0] WRCOUNT;
+ output WRERR;
+ input [63:0] DI;
+ input [7:0] DIP;
+ input INJECTDBITERR;
+ input INJECTSBITERR;
+ input RDCLK;
+ input RDEN;
+ input REGCE;
+ input RST;
+ input RSTREG;
+ input WRCLK;
+ input WREN;
+endmodule
+
+module FRAME_ECCE2 (...);
+ parameter FARSRC = "EFAR";
+ parameter FRAME_RBT_IN_FILENAME = "NONE";
+ output CRCERROR;
+ output ECCERROR;
+ output ECCERRORSINGLE;
+ output SYNDROMEVALID;
+ output [12:0] SYNDROME;
+ output [25:0] FAR;
+ output [4:0] SYNBIT;
+ output [6:0] SYNWORD;
+endmodule
+
+module GTHE2_CHANNEL (...);
+ parameter [0:0] ACJTAG_DEBUG_MODE = 1'b0;
+ parameter [0:0] ACJTAG_MODE = 1'b0;
+ parameter [0:0] ACJTAG_RESET = 1'b0;
+ parameter [19:0] ADAPT_CFG0 = 20'h00C10;
+ parameter ALIGN_COMMA_DOUBLE = "FALSE";
+ parameter [9:0] ALIGN_COMMA_ENABLE = 10'b0001111111;
+ parameter integer ALIGN_COMMA_WORD = 1;
+ parameter ALIGN_MCOMMA_DET = "TRUE";
+ parameter [9:0] ALIGN_MCOMMA_VALUE = 10'b1010000011;
+ parameter ALIGN_PCOMMA_DET = "TRUE";
+ parameter [9:0] ALIGN_PCOMMA_VALUE = 10'b0101111100;
+ parameter [0:0] A_RXOSCALRESET = 1'b0;
+ parameter CBCC_DATA_SOURCE_SEL = "DECODED";
+ parameter [41:0] CFOK_CFG = 42'h24800040E80;
+ parameter [5:0] CFOK_CFG2 = 6'b100000;
+ parameter [5:0] CFOK_CFG3 = 6'b100000;
+ parameter CHAN_BOND_KEEP_ALIGN = "FALSE";
+ parameter integer CHAN_BOND_MAX_SKEW = 7;
+ parameter [9:0] CHAN_BOND_SEQ_1_1 = 10'b0101111100;
+ parameter [9:0] CHAN_BOND_SEQ_1_2 = 10'b0000000000;
+ parameter [9:0] CHAN_BOND_SEQ_1_3 = 10'b0000000000;
+ parameter [9:0] CHAN_BOND_SEQ_1_4 = 10'b0000000000;
+ parameter [3:0] CHAN_BOND_SEQ_1_ENABLE = 4'b1111;
+ parameter [9:0] CHAN_BOND_SEQ_2_1 = 10'b0100000000;
+ parameter [9:0] CHAN_BOND_SEQ_2_2 = 10'b0100000000;
+ parameter [9:0] CHAN_BOND_SEQ_2_3 = 10'b0100000000;
+ parameter [9:0] CHAN_BOND_SEQ_2_4 = 10'b0100000000;
+ parameter [3:0] CHAN_BOND_SEQ_2_ENABLE = 4'b1111;
+ parameter CHAN_BOND_SEQ_2_USE = "FALSE";
+ parameter integer CHAN_BOND_SEQ_LEN = 1;
+ parameter CLK_CORRECT_USE = "TRUE";
+ parameter CLK_COR_KEEP_IDLE = "FALSE";
+ parameter integer CLK_COR_MAX_LAT = 20;
+ parameter integer CLK_COR_MIN_LAT = 18;
+ parameter CLK_COR_PRECEDENCE = "TRUE";
+ parameter integer CLK_COR_REPEAT_WAIT = 0;
+ parameter [9:0] CLK_COR_SEQ_1_1 = 10'b0100011100;
+ parameter [9:0] CLK_COR_SEQ_1_2 = 10'b0000000000;
+ parameter [9:0] CLK_COR_SEQ_1_3 = 10'b0000000000;
+ parameter [9:0] CLK_COR_SEQ_1_4 = 10'b0000000000;
+ parameter [3:0] CLK_COR_SEQ_1_ENABLE = 4'b1111;
+ parameter [9:0] CLK_COR_SEQ_2_1 = 10'b0100000000;
+ parameter [9:0] CLK_COR_SEQ_2_2 = 10'b0100000000;
+ parameter [9:0] CLK_COR_SEQ_2_3 = 10'b0100000000;
+ parameter [9:0] CLK_COR_SEQ_2_4 = 10'b0100000000;
+ parameter [3:0] CLK_COR_SEQ_2_ENABLE = 4'b1111;
+ parameter CLK_COR_SEQ_2_USE = "FALSE";
+ parameter integer CLK_COR_SEQ_LEN = 1;
+ parameter [28:0] CPLL_CFG = 29'h00BC07DC;
+ parameter integer CPLL_FBDIV = 4;
+ parameter integer CPLL_FBDIV_45 = 5;
+ parameter [23:0] CPLL_INIT_CFG = 24'h00001E;
+ parameter [15:0] CPLL_LOCK_CFG = 16'h01E8;
+ parameter integer CPLL_REFCLK_DIV = 1;
+ parameter DEC_MCOMMA_DETECT = "TRUE";
+ parameter DEC_PCOMMA_DETECT = "TRUE";
+ parameter DEC_VALID_COMMA_ONLY = "TRUE";
+ parameter [23:0] DMONITOR_CFG = 24'h000A00;
+ parameter [0:0] ES_CLK_PHASE_SEL = 1'b0;
+ parameter [5:0] ES_CONTROL = 6'b000000;
+ parameter ES_ERRDET_EN = "FALSE";
+ parameter ES_EYE_SCAN_EN = "TRUE";
+ parameter [11:0] ES_HORZ_OFFSET = 12'h000;
+ parameter [9:0] ES_PMA_CFG = 10'b0000000000;
+ parameter [4:0] ES_PRESCALE = 5'b00000;
+ parameter [79:0] ES_QUALIFIER = 80'h00000000000000000000;
+ parameter [79:0] ES_QUAL_MASK = 80'h00000000000000000000;
+ parameter [79:0] ES_SDATA_MASK = 80'h00000000000000000000;
+ parameter [8:0] ES_VERT_OFFSET = 9'b000000000;
+ parameter [3:0] FTS_DESKEW_SEQ_ENABLE = 4'b1111;
+ parameter [3:0] FTS_LANE_DESKEW_CFG = 4'b1111;
+ parameter FTS_LANE_DESKEW_EN = "FALSE";
+ parameter [2:0] GEARBOX_MODE = 3'b000;
+ parameter [0:0] IS_CLKRSVD0_INVERTED = 1'b0;
+ parameter [0:0] IS_CLKRSVD1_INVERTED = 1'b0;
+ parameter [0:0] IS_CPLLLOCKDETCLK_INVERTED = 1'b0;
+ parameter [0:0] IS_DMONITORCLK_INVERTED = 1'b0;
+ parameter [0:0] IS_DRPCLK_INVERTED = 1'b0;
+ parameter [0:0] IS_GTGREFCLK_INVERTED = 1'b0;
+ parameter [0:0] IS_RXUSRCLK2_INVERTED = 1'b0;
+ parameter [0:0] IS_RXUSRCLK_INVERTED = 1'b0;
+ parameter [0:0] IS_SIGVALIDCLK_INVERTED = 1'b0;
+ parameter [0:0] IS_TXPHDLYTSTCLK_INVERTED = 1'b0;
+ parameter [0:0] IS_TXUSRCLK2_INVERTED = 1'b0;
+ parameter [0:0] IS_TXUSRCLK_INVERTED = 1'b0;
+ parameter [0:0] LOOPBACK_CFG = 1'b0;
+ parameter [1:0] OUTREFCLK_SEL_INV = 2'b11;
+ parameter PCS_PCIE_EN = "FALSE";
+ parameter [47:0] PCS_RSVD_ATTR = 48'h000000000000;
+ parameter [11:0] PD_TRANS_TIME_FROM_P2 = 12'h03C;
+ parameter [7:0] PD_TRANS_TIME_NONE_P2 = 8'h19;
+ parameter [7:0] PD_TRANS_TIME_TO_P2 = 8'h64;
+ parameter [31:0] PMA_RSV = 32'b00000000000000000000000010000000;
+ parameter [31:0] PMA_RSV2 = 32'b00011100000000000000000000001010;
+ parameter [1:0] PMA_RSV3 = 2'b00;
+ parameter [14:0] PMA_RSV4 = 15'b000000000001000;
+ parameter [3:0] PMA_RSV5 = 4'b0000;
+ parameter [0:0] RESET_POWERSAVE_DISABLE = 1'b0;
+ parameter [4:0] RXBUFRESET_TIME = 5'b00001;
+ parameter RXBUF_ADDR_MODE = "FULL";
+ parameter [3:0] RXBUF_EIDLE_HI_CNT = 4'b1000;
+ parameter [3:0] RXBUF_EIDLE_LO_CNT = 4'b0000;
+ parameter RXBUF_EN = "TRUE";
+ parameter RXBUF_RESET_ON_CB_CHANGE = "TRUE";
+ parameter RXBUF_RESET_ON_COMMAALIGN = "FALSE";
+ parameter RXBUF_RESET_ON_EIDLE = "FALSE";
+ parameter RXBUF_RESET_ON_RATE_CHANGE = "TRUE";
+ parameter integer RXBUF_THRESH_OVFLW = 61;
+ parameter RXBUF_THRESH_OVRD = "FALSE";
+ parameter integer RXBUF_THRESH_UNDFLW = 4;
+ parameter [4:0] RXCDRFREQRESET_TIME = 5'b00001;
+ parameter [4:0] RXCDRPHRESET_TIME = 5'b00001;
+ parameter [82:0] RXCDR_CFG = 83'h0002007FE2000C208001A;
+ parameter [0:0] RXCDR_FR_RESET_ON_EIDLE = 1'b0;
+ parameter [0:0] RXCDR_HOLD_DURING_EIDLE = 1'b0;
+ parameter [5:0] RXCDR_LOCK_CFG = 6'b001001;
+ parameter [0:0] RXCDR_PH_RESET_ON_EIDLE = 1'b0;
+ parameter [6:0] RXDFELPMRESET_TIME = 7'b0001111;
+ parameter [15:0] RXDLY_CFG = 16'h001F;
+ parameter [8:0] RXDLY_LCFG = 9'h030;
+ parameter [15:0] RXDLY_TAP_CFG = 16'h0000;
+ parameter RXGEARBOX_EN = "FALSE";
+ parameter [4:0] RXISCANRESET_TIME = 5'b00001;
+ parameter [13:0] RXLPM_HF_CFG = 14'b00001000000000;
+ parameter [17:0] RXLPM_LF_CFG = 18'b001001000000000000;
+ parameter [6:0] RXOOB_CFG = 7'b0000110;
+ parameter RXOOB_CLK_CFG = "PMA";
+ parameter [4:0] RXOSCALRESET_TIME = 5'b00011;
+ parameter [4:0] RXOSCALRESET_TIMEOUT = 5'b00000;
+ parameter integer RXOUT_DIV = 2;
+ parameter [4:0] RXPCSRESET_TIME = 5'b00001;
+ parameter [23:0] RXPHDLY_CFG = 24'h084020;
+ parameter [23:0] RXPH_CFG = 24'hC00002;
+ parameter [4:0] RXPH_MONITOR_SEL = 5'b00000;
+ parameter [1:0] RXPI_CFG0 = 2'b00;
+ parameter [1:0] RXPI_CFG1 = 2'b00;
+ parameter [1:0] RXPI_CFG2 = 2'b00;
+ parameter [1:0] RXPI_CFG3 = 2'b00;
+ parameter [0:0] RXPI_CFG4 = 1'b0;
+ parameter [0:0] RXPI_CFG5 = 1'b0;
+ parameter [2:0] RXPI_CFG6 = 3'b100;
+ parameter [4:0] RXPMARESET_TIME = 5'b00011;
+ parameter [0:0] RXPRBS_ERR_LOOPBACK = 1'b0;
+ parameter integer RXSLIDE_AUTO_WAIT = 7;
+ parameter RXSLIDE_MODE = "OFF";
+ parameter [0:0] RXSYNC_MULTILANE = 1'b0;
+ parameter [0:0] RXSYNC_OVRD = 1'b0;
+ parameter [0:0] RXSYNC_SKIP_DA = 1'b0;
+ parameter [23:0] RX_BIAS_CFG = 24'b000011000000000000010000;
+ parameter [5:0] RX_BUFFER_CFG = 6'b000000;
+ parameter integer RX_CLK25_DIV = 7;
+ parameter [0:0] RX_CLKMUX_PD = 1'b1;
+ parameter [1:0] RX_CM_SEL = 2'b11;
+ parameter [3:0] RX_CM_TRIM = 4'b0100;
+ parameter integer RX_DATA_WIDTH = 20;
+ parameter [5:0] RX_DDI_SEL = 6'b000000;
+ parameter [13:0] RX_DEBUG_CFG = 14'b00000000000000;
+ parameter RX_DEFER_RESET_BUF_EN = "TRUE";
+ parameter [3:0] RX_DFELPM_CFG0 = 4'b0110;
+ parameter [0:0] RX_DFELPM_CFG1 = 1'b0;
+ parameter [0:0] RX_DFELPM_KLKH_AGC_STUP_EN = 1'b1;
+ parameter [1:0] RX_DFE_AGC_CFG0 = 2'b00;
+ parameter [2:0] RX_DFE_AGC_CFG1 = 3'b010;
+ parameter [3:0] RX_DFE_AGC_CFG2 = 4'b0000;
+ parameter [0:0] RX_DFE_AGC_OVRDEN = 1'b1;
+ parameter [22:0] RX_DFE_GAIN_CFG = 23'h0020C0;
+ parameter [11:0] RX_DFE_H2_CFG = 12'b000000000000;
+ parameter [11:0] RX_DFE_H3_CFG = 12'b000001000000;
+ parameter [10:0] RX_DFE_H4_CFG = 11'b00011100000;
+ parameter [10:0] RX_DFE_H5_CFG = 11'b00011100000;
+ parameter [10:0] RX_DFE_H6_CFG = 11'b00000100000;
+ parameter [10:0] RX_DFE_H7_CFG = 11'b00000100000;
+ parameter [32:0] RX_DFE_KL_CFG = 33'b000000000000000000000001100010000;
+ parameter [1:0] RX_DFE_KL_LPM_KH_CFG0 = 2'b01;
+ parameter [2:0] RX_DFE_KL_LPM_KH_CFG1 = 3'b010;
+ parameter [3:0] RX_DFE_KL_LPM_KH_CFG2 = 4'b0010;
+ parameter [0:0] RX_DFE_KL_LPM_KH_OVRDEN = 1'b1;
+ parameter [1:0] RX_DFE_KL_LPM_KL_CFG0 = 2'b10;
+ parameter [2:0] RX_DFE_KL_LPM_KL_CFG1 = 3'b010;
+ parameter [3:0] RX_DFE_KL_LPM_KL_CFG2 = 4'b0010;
+ parameter [0:0] RX_DFE_KL_LPM_KL_OVRDEN = 1'b1;
+ parameter [15:0] RX_DFE_LPM_CFG = 16'h0080;
+ parameter [0:0] RX_DFE_LPM_HOLD_DURING_EIDLE = 1'b0;
+ parameter [53:0] RX_DFE_ST_CFG = 54'h00E100000C003F;
+ parameter [16:0] RX_DFE_UT_CFG = 17'b00011100000000000;
+ parameter [16:0] RX_DFE_VP_CFG = 17'b00011101010100011;
+ parameter RX_DISPERR_SEQ_MATCH = "TRUE";
+ parameter integer RX_INT_DATAWIDTH = 0;
+ parameter [12:0] RX_OS_CFG = 13'b0000010000000;
+ parameter integer RX_SIG_VALID_DLY = 10;
+ parameter RX_XCLK_SEL = "RXREC";
+ parameter integer SAS_MAX_COM = 64;
+ parameter integer SAS_MIN_COM = 36;
+ parameter [3:0] SATA_BURST_SEQ_LEN = 4'b1111;
+ parameter [2:0] SATA_BURST_VAL = 3'b100;
+ parameter SATA_CPLL_CFG = "VCO_3000MHZ";
+ parameter [2:0] SATA_EIDLE_VAL = 3'b100;
+ parameter integer SATA_MAX_BURST = 8;
+ parameter integer SATA_MAX_INIT = 21;
+ parameter integer SATA_MAX_WAKE = 7;
+ parameter integer SATA_MIN_BURST = 4;
+ parameter integer SATA_MIN_INIT = 12;
+ parameter integer SATA_MIN_WAKE = 4;
+ parameter SHOW_REALIGN_COMMA = "TRUE";
+ parameter [2:0] SIM_CPLLREFCLK_SEL = 3'b001;
+ parameter SIM_RECEIVER_DETECT_PASS = "TRUE";
+ parameter SIM_RESET_SPEEDUP = "TRUE";
+ parameter SIM_TX_EIDLE_DRIVE_LEVEL = "X";
+ parameter SIM_VERSION = "1.1";
+ parameter [14:0] TERM_RCAL_CFG = 15'b100001000010000;
+ parameter [2:0] TERM_RCAL_OVRD = 3'b000;
+ parameter [7:0] TRANS_TIME_RATE = 8'h0E;
+ parameter [31:0] TST_RSV = 32'h00000000;
+ parameter TXBUF_EN = "TRUE";
+ parameter TXBUF_RESET_ON_RATE_CHANGE = "FALSE";
+ parameter [15:0] TXDLY_CFG = 16'h001F;
+ parameter [8:0] TXDLY_LCFG = 9'h030;
+ parameter [15:0] TXDLY_TAP_CFG = 16'h0000;
+ parameter TXGEARBOX_EN = "FALSE";
+ parameter [0:0] TXOOB_CFG = 1'b0;
+ parameter integer TXOUT_DIV = 2;
+ parameter [4:0] TXPCSRESET_TIME = 5'b00001;
+ parameter [23:0] TXPHDLY_CFG = 24'h084020;
+ parameter [15:0] TXPH_CFG = 16'h0780;
+ parameter [4:0] TXPH_MONITOR_SEL = 5'b00000;
+ parameter [1:0] TXPI_CFG0 = 2'b00;
+ parameter [1:0] TXPI_CFG1 = 2'b00;
+ parameter [1:0] TXPI_CFG2 = 2'b00;
+ parameter [0:0] TXPI_CFG3 = 1'b0;
+ parameter [0:0] TXPI_CFG4 = 1'b0;
+ parameter [2:0] TXPI_CFG5 = 3'b100;
+ parameter [0:0] TXPI_GREY_SEL = 1'b0;
+ parameter [0:0] TXPI_INVSTROBE_SEL = 1'b0;
+ parameter TXPI_PPMCLK_SEL = "TXUSRCLK2";
+ parameter [7:0] TXPI_PPM_CFG = 8'b00000000;
+ parameter [2:0] TXPI_SYNFREQ_PPM = 3'b000;
+ parameter [4:0] TXPMARESET_TIME = 5'b00001;
+ parameter [0:0] TXSYNC_MULTILANE = 1'b0;
+ parameter [0:0] TXSYNC_OVRD = 1'b0;
+ parameter [0:0] TXSYNC_SKIP_DA = 1'b0;
+ parameter integer TX_CLK25_DIV = 7;
+ parameter [0:0] TX_CLKMUX_PD = 1'b1;
+ parameter integer TX_DATA_WIDTH = 20;
+ parameter [5:0] TX_DEEMPH0 = 6'b000000;
+ parameter [5:0] TX_DEEMPH1 = 6'b000000;
+ parameter TX_DRIVE_MODE = "DIRECT";
+ parameter [2:0] TX_EIDLE_ASSERT_DELAY = 3'b110;
+ parameter [2:0] TX_EIDLE_DEASSERT_DELAY = 3'b100;
+ parameter integer TX_INT_DATAWIDTH = 0;
+ parameter TX_LOOPBACK_DRIVE_HIZ = "FALSE";
+ parameter [0:0] TX_MAINCURSOR_SEL = 1'b0;
+ parameter [6:0] TX_MARGIN_FULL_0 = 7'b1001110;
+ parameter [6:0] TX_MARGIN_FULL_1 = 7'b1001001;
+ parameter [6:0] TX_MARGIN_FULL_2 = 7'b1000101;
+ parameter [6:0] TX_MARGIN_FULL_3 = 7'b1000010;
+ parameter [6:0] TX_MARGIN_FULL_4 = 7'b1000000;
+ parameter [6:0] TX_MARGIN_LOW_0 = 7'b1000110;
+ parameter [6:0] TX_MARGIN_LOW_1 = 7'b1000100;
+ parameter [6:0] TX_MARGIN_LOW_2 = 7'b1000010;
+ parameter [6:0] TX_MARGIN_LOW_3 = 7'b1000000;
+ parameter [6:0] TX_MARGIN_LOW_4 = 7'b1000000;
+ parameter [0:0] TX_QPI_STATUS_EN = 1'b0;
+ parameter [13:0] TX_RXDETECT_CFG = 14'h1832;
+ parameter [16:0] TX_RXDETECT_PRECHARGE_TIME = 17'h00000;
+ parameter [2:0] TX_RXDETECT_REF = 3'b100;
+ parameter TX_XCLK_SEL = "TXUSR";
+ parameter [0:0] UCODEER_CLR = 1'b0;
+ parameter [0:0] USE_PCS_CLK_PHASE_SEL = 1'b0;
+ output CPLLFBCLKLOST;
+ output CPLLLOCK;
+ output CPLLREFCLKLOST;
+ output DRPRDY;
+ output EYESCANDATAERROR;
+ output GTHTXN;
+ output GTHTXP;
+ output GTREFCLKMONITOR;
+ output PHYSTATUS;
+ output RSOSINTDONE;
+ output RXBYTEISALIGNED;
+ output RXBYTEREALIGN;
+ output RXCDRLOCK;
+ output RXCHANBONDSEQ;
+ output RXCHANISALIGNED;
+ output RXCHANREALIGN;
+ output RXCOMINITDET;
+ output RXCOMMADET;
+ output RXCOMSASDET;
+ output RXCOMWAKEDET;
+ output RXDFESLIDETAPSTARTED;
+ output RXDFESLIDETAPSTROBEDONE;
+ output RXDFESLIDETAPSTROBESTARTED;
+ output RXDFESTADAPTDONE;
+ output RXDLYSRESETDONE;
+ output RXELECIDLE;
+ output RXOSINTSTARTED;
+ output RXOSINTSTROBEDONE;
+ output RXOSINTSTROBESTARTED;
+ output RXOUTCLK;
+ output RXOUTCLKFABRIC;
+ output RXOUTCLKPCS;
+ output RXPHALIGNDONE;
+ output RXPMARESETDONE;
+ output RXPRBSERR;
+ output RXQPISENN;
+ output RXQPISENP;
+ output RXRATEDONE;
+ output RXRESETDONE;
+ output RXSYNCDONE;
+ output RXSYNCOUT;
+ output RXVALID;
+ output TXCOMFINISH;
+ output TXDLYSRESETDONE;
+ output TXGEARBOXREADY;
+ output TXOUTCLK;
+ output TXOUTCLKFABRIC;
+ output TXOUTCLKPCS;
+ output TXPHALIGNDONE;
+ output TXPHINITDONE;
+ output TXPMARESETDONE;
+ output TXQPISENN;
+ output TXQPISENP;
+ output TXRATEDONE;
+ output TXRESETDONE;
+ output TXSYNCDONE;
+ output TXSYNCOUT;
+ output [14:0] DMONITOROUT;
+ output [15:0] DRPDO;
+ output [15:0] PCSRSVDOUT;
+ output [1:0] RXCLKCORCNT;
+ output [1:0] RXDATAVALID;
+ output [1:0] RXHEADERVALID;
+ output [1:0] RXSTARTOFSEQ;
+ output [1:0] TXBUFSTATUS;
+ output [2:0] RXBUFSTATUS;
+ output [2:0] RXSTATUS;
+ output [4:0] RXCHBONDO;
+ output [4:0] RXPHMONITOR;
+ output [4:0] RXPHSLIPMONITOR;
+ output [5:0] RXHEADER;
+ output [63:0] RXDATA;
+ output [6:0] RXMONITOROUT;
+ output [7:0] RXCHARISCOMMA;
+ output [7:0] RXCHARISK;
+ output [7:0] RXDISPERR;
+ output [7:0] RXNOTINTABLE;
+ input CFGRESET;
+ input CLKRSVD0;
+ input CLKRSVD1;
+ input CPLLLOCKDETCLK;
+ input CPLLLOCKEN;
+ input CPLLPD;
+ input CPLLRESET;
+ input DMONFIFORESET;
+ input DMONITORCLK;
+ input DRPCLK;
+ input DRPEN;
+ input DRPWE;
+ input EYESCANMODE;
+ input EYESCANRESET;
+ input EYESCANTRIGGER;
+ input GTGREFCLK;
+ input GTHRXN;
+ input GTHRXP;
+ input GTNORTHREFCLK0;
+ input GTNORTHREFCLK1;
+ input GTREFCLK0;
+ input GTREFCLK1;
+ input GTRESETSEL;
+ input GTRXRESET;
+ input GTSOUTHREFCLK0;
+ input GTSOUTHREFCLK1;
+ input GTTXRESET;
+ input QPLLCLK;
+ input QPLLREFCLK;
+ input RESETOVRD;
+ input RX8B10BEN;
+ input RXBUFRESET;
+ input RXCDRFREQRESET;
+ input RXCDRHOLD;
+ input RXCDROVRDEN;
+ input RXCDRRESET;
+ input RXCDRRESETRSV;
+ input RXCHBONDEN;
+ input RXCHBONDMASTER;
+ input RXCHBONDSLAVE;
+ input RXCOMMADETEN;
+ input RXDDIEN;
+ input RXDFEAGCHOLD;
+ input RXDFEAGCOVRDEN;
+ input RXDFECM1EN;
+ input RXDFELFHOLD;
+ input RXDFELFOVRDEN;
+ input RXDFELPMRESET;
+ input RXDFESLIDETAPADAPTEN;
+ input RXDFESLIDETAPHOLD;
+ input RXDFESLIDETAPINITOVRDEN;
+ input RXDFESLIDETAPONLYADAPTEN;
+ input RXDFESLIDETAPOVRDEN;
+ input RXDFESLIDETAPSTROBE;
+ input RXDFETAP2HOLD;
+ input RXDFETAP2OVRDEN;
+ input RXDFETAP3HOLD;
+ input RXDFETAP3OVRDEN;
+ input RXDFETAP4HOLD;
+ input RXDFETAP4OVRDEN;
+ input RXDFETAP5HOLD;
+ input RXDFETAP5OVRDEN;
+ input RXDFETAP6HOLD;
+ input RXDFETAP6OVRDEN;
+ input RXDFETAP7HOLD;
+ input RXDFETAP7OVRDEN;
+ input RXDFEUTHOLD;
+ input RXDFEUTOVRDEN;
+ input RXDFEVPHOLD;
+ input RXDFEVPOVRDEN;
+ input RXDFEVSEN;
+ input RXDFEXYDEN;
+ input RXDLYBYPASS;
+ input RXDLYEN;
+ input RXDLYOVRDEN;
+ input RXDLYSRESET;
+ input RXGEARBOXSLIP;
+ input RXLPMEN;
+ input RXLPMHFHOLD;
+ input RXLPMHFOVRDEN;
+ input RXLPMLFHOLD;
+ input RXLPMLFKLOVRDEN;
+ input RXMCOMMAALIGNEN;
+ input RXOOBRESET;
+ input RXOSCALRESET;
+ input RXOSHOLD;
+ input RXOSINTEN;
+ input RXOSINTHOLD;
+ input RXOSINTNTRLEN;
+ input RXOSINTOVRDEN;
+ input RXOSINTSTROBE;
+ input RXOSINTTESTOVRDEN;
+ input RXOSOVRDEN;
+ input RXPCOMMAALIGNEN;
+ input RXPCSRESET;
+ input RXPHALIGN;
+ input RXPHALIGNEN;
+ input RXPHDLYPD;
+ input RXPHDLYRESET;
+ input RXPHOVRDEN;
+ input RXPMARESET;
+ input RXPOLARITY;
+ input RXPRBSCNTRESET;
+ input RXQPIEN;
+ input RXRATEMODE;
+ input RXSLIDE;
+ input RXSYNCALLIN;
+ input RXSYNCIN;
+ input RXSYNCMODE;
+ input RXUSERRDY;
+ input RXUSRCLK2;
+ input RXUSRCLK;
+ input SETERRSTATUS;
+ input SIGVALIDCLK;
+ input TX8B10BEN;
+ input TXCOMINIT;
+ input TXCOMSAS;
+ input TXCOMWAKE;
+ input TXDEEMPH;
+ input TXDETECTRX;
+ input TXDIFFPD;
+ input TXDLYBYPASS;
+ input TXDLYEN;
+ input TXDLYHOLD;
+ input TXDLYOVRDEN;
+ input TXDLYSRESET;
+ input TXDLYUPDOWN;
+ input TXELECIDLE;
+ input TXINHIBIT;
+ input TXPCSRESET;
+ input TXPDELECIDLEMODE;
+ input TXPHALIGN;
+ input TXPHALIGNEN;
+ input TXPHDLYPD;
+ input TXPHDLYRESET;
+ input TXPHDLYTSTCLK;
+ input TXPHINIT;
+ input TXPHOVRDEN;
+ input TXPIPPMEN;
+ input TXPIPPMOVRDEN;
+ input TXPIPPMPD;
+ input TXPIPPMSEL;
+ input TXPISOPD;
+ input TXPMARESET;
+ input TXPOLARITY;
+ input TXPOSTCURSORINV;
+ input TXPRBSFORCEERR;
+ input TXPRECURSORINV;
+ input TXQPIBIASEN;
+ input TXQPISTRONGPDOWN;
+ input TXQPIWEAKPUP;
+ input TXRATEMODE;
+ input TXSTARTSEQ;
+ input TXSWING;
+ input TXSYNCALLIN;
+ input TXSYNCIN;
+ input TXSYNCMODE;
+ input TXUSERRDY;
+ input TXUSRCLK2;
+ input TXUSRCLK;
+ input [13:0] RXADAPTSELTEST;
+ input [15:0] DRPDI;
+ input [15:0] GTRSVD;
+ input [15:0] PCSRSVDIN;
+ input [19:0] TSTIN;
+ input [1:0] RXELECIDLEMODE;
+ input [1:0] RXMONITORSEL;
+ input [1:0] RXPD;
+ input [1:0] RXSYSCLKSEL;
+ input [1:0] TXPD;
+ input [1:0] TXSYSCLKSEL;
+ input [2:0] CPLLREFCLKSEL;
+ input [2:0] LOOPBACK;
+ input [2:0] RXCHBONDLEVEL;
+ input [2:0] RXOUTCLKSEL;
+ input [2:0] RXPRBSSEL;
+ input [2:0] RXRATE;
+ input [2:0] TXBUFDIFFCTRL;
+ input [2:0] TXHEADER;
+ input [2:0] TXMARGIN;
+ input [2:0] TXOUTCLKSEL;
+ input [2:0] TXPRBSSEL;
+ input [2:0] TXRATE;
+ input [3:0] RXOSINTCFG;
+ input [3:0] RXOSINTID0;
+ input [3:0] TXDIFFCTRL;
+ input [4:0] PCSRSVDIN2;
+ input [4:0] PMARSVDIN;
+ input [4:0] RXCHBONDI;
+ input [4:0] RXDFEAGCTRL;
+ input [4:0] RXDFESLIDETAP;
+ input [4:0] TXPIPPMSTEPSIZE;
+ input [4:0] TXPOSTCURSOR;
+ input [4:0] TXPRECURSOR;
+ input [5:0] RXDFESLIDETAPID;
+ input [63:0] TXDATA;
+ input [6:0] TXMAINCURSOR;
+ input [6:0] TXSEQUENCE;
+ input [7:0] TX8B10BBYPASS;
+ input [7:0] TXCHARDISPMODE;
+ input [7:0] TXCHARDISPVAL;
+ input [7:0] TXCHARISK;
+ input [8:0] DRPADDR;
+endmodule
+
+module GTHE2_COMMON (...);
+ parameter [63:0] BIAS_CFG = 64'h0000040000001000;
+ parameter [31:0] COMMON_CFG = 32'h0000001C;
+ parameter [0:0] IS_DRPCLK_INVERTED = 1'b0;
+ parameter [0:0] IS_GTGREFCLK_INVERTED = 1'b0;
+ parameter [0:0] IS_QPLLLOCKDETCLK_INVERTED = 1'b0;
+ parameter [26:0] QPLL_CFG = 27'h0480181;
+ parameter [3:0] QPLL_CLKOUT_CFG = 4'b0000;
+ parameter [5:0] QPLL_COARSE_FREQ_OVRD = 6'b010000;
+ parameter [0:0] QPLL_COARSE_FREQ_OVRD_EN = 1'b0;
+ parameter [9:0] QPLL_CP = 10'b0000011111;
+ parameter [0:0] QPLL_CP_MONITOR_EN = 1'b0;
+ parameter [0:0] QPLL_DMONITOR_SEL = 1'b0;
+ parameter [9:0] QPLL_FBDIV = 10'b0000000000;
+ parameter [0:0] QPLL_FBDIV_MONITOR_EN = 1'b0;
+ parameter [0:0] QPLL_FBDIV_RATIO = 1'b0;
+ parameter [23:0] QPLL_INIT_CFG = 24'h000006;
+ parameter [15:0] QPLL_LOCK_CFG = 16'h01E8;
+ parameter [3:0] QPLL_LPF = 4'b1111;
+ parameter integer QPLL_REFCLK_DIV = 2;
+ parameter [0:0] QPLL_RP_COMP = 1'b0;
+ parameter [1:0] QPLL_VTRL_RESET = 2'b00;
+ parameter [1:0] RCAL_CFG = 2'b00;
+ parameter [15:0] RSVD_ATTR0 = 16'h0000;
+ parameter [15:0] RSVD_ATTR1 = 16'h0000;
+ parameter [2:0] SIM_QPLLREFCLK_SEL = 3'b001;
+ parameter SIM_RESET_SPEEDUP = "TRUE";
+ parameter SIM_VERSION = "1.1";
+ output DRPRDY;
+ output QPLLFBCLKLOST;
+ output QPLLLOCK;
+ output QPLLOUTCLK;
+ output QPLLOUTREFCLK;
+ output QPLLREFCLKLOST;
+ output REFCLKOUTMONITOR;
+ output [15:0] DRPDO;
+ output [15:0] PMARSVDOUT;
+ output [7:0] QPLLDMONITOR;
+ input BGBYPASSB;
+ input BGMONITORENB;
+ input BGPDB;
+ input BGRCALOVRDENB;
+ input DRPCLK;
+ input DRPEN;
+ input DRPWE;
+ input GTGREFCLK;
+ input GTNORTHREFCLK0;
+ input GTNORTHREFCLK1;
+ input GTREFCLK0;
+ input GTREFCLK1;
+ input GTSOUTHREFCLK0;
+ input GTSOUTHREFCLK1;
+ input QPLLLOCKDETCLK;
+ input QPLLLOCKEN;
+ input QPLLOUTRESET;
+ input QPLLPD;
+ input QPLLRESET;
+ input RCALENB;
+ input [15:0] DRPDI;
+ input [15:0] QPLLRSVD1;
+ input [2:0] QPLLREFCLKSEL;
+ input [4:0] BGRCALOVRD;
+ input [4:0] QPLLRSVD2;
+ input [7:0] DRPADDR;
+ input [7:0] PMARSVD;
+endmodule
+
+module GTPE2_CHANNEL (...);
+ parameter [0:0] ACJTAG_DEBUG_MODE = 1'b0;
+ parameter [0:0] ACJTAG_MODE = 1'b0;
+ parameter [0:0] ACJTAG_RESET = 1'b0;
+ parameter [19:0] ADAPT_CFG0 = 20'b00000000000000000000;
+ parameter ALIGN_COMMA_DOUBLE = "FALSE";
+ parameter [9:0] ALIGN_COMMA_ENABLE = 10'b0001111111;
+ parameter integer ALIGN_COMMA_WORD = 1;
+ parameter ALIGN_MCOMMA_DET = "TRUE";
+ parameter [9:0] ALIGN_MCOMMA_VALUE = 10'b1010000011;
+ parameter ALIGN_PCOMMA_DET = "TRUE";
+ parameter [9:0] ALIGN_PCOMMA_VALUE = 10'b0101111100;
+ parameter CBCC_DATA_SOURCE_SEL = "DECODED";
+ parameter [42:0] CFOK_CFG = 43'b1001001000000000000000001000000111010000000;
+ parameter [6:0] CFOK_CFG2 = 7'b0100000;
+ parameter [6:0] CFOK_CFG3 = 7'b0100000;
+ parameter [0:0] CFOK_CFG4 = 1'b0;
+ parameter [1:0] CFOK_CFG5 = 2'b00;
+ parameter [3:0] CFOK_CFG6 = 4'b0000;
+ parameter CHAN_BOND_KEEP_ALIGN = "FALSE";
+ parameter integer CHAN_BOND_MAX_SKEW = 7;
+ parameter [9:0] CHAN_BOND_SEQ_1_1 = 10'b0101111100;
+ parameter [9:0] CHAN_BOND_SEQ_1_2 = 10'b0000000000;
+ parameter [9:0] CHAN_BOND_SEQ_1_3 = 10'b0000000000;
+ parameter [9:0] CHAN_BOND_SEQ_1_4 = 10'b0000000000;
+ parameter [3:0] CHAN_BOND_SEQ_1_ENABLE = 4'b1111;
+ parameter [9:0] CHAN_BOND_SEQ_2_1 = 10'b0100000000;
+ parameter [9:0] CHAN_BOND_SEQ_2_2 = 10'b0100000000;
+ parameter [9:0] CHAN_BOND_SEQ_2_3 = 10'b0100000000;
+ parameter [9:0] CHAN_BOND_SEQ_2_4 = 10'b0100000000;
+ parameter [3:0] CHAN_BOND_SEQ_2_ENABLE = 4'b1111;
+ parameter CHAN_BOND_SEQ_2_USE = "FALSE";
+ parameter integer CHAN_BOND_SEQ_LEN = 1;
+ parameter [0:0] CLK_COMMON_SWING = 1'b0;
+ parameter CLK_CORRECT_USE = "TRUE";
+ parameter CLK_COR_KEEP_IDLE = "FALSE";
+ parameter integer CLK_COR_MAX_LAT = 20;
+ parameter integer CLK_COR_MIN_LAT = 18;
+ parameter CLK_COR_PRECEDENCE = "TRUE";
+ parameter integer CLK_COR_REPEAT_WAIT = 0;
+ parameter [9:0] CLK_COR_SEQ_1_1 = 10'b0100011100;
+ parameter [9:0] CLK_COR_SEQ_1_2 = 10'b0000000000;
+ parameter [9:0] CLK_COR_SEQ_1_3 = 10'b0000000000;
+ parameter [9:0] CLK_COR_SEQ_1_4 = 10'b0000000000;
+ parameter [3:0] CLK_COR_SEQ_1_ENABLE = 4'b1111;
+ parameter [9:0] CLK_COR_SEQ_2_1 = 10'b0100000000;
+ parameter [9:0] CLK_COR_SEQ_2_2 = 10'b0100000000;
+ parameter [9:0] CLK_COR_SEQ_2_3 = 10'b0100000000;
+ parameter [9:0] CLK_COR_SEQ_2_4 = 10'b0100000000;
+ parameter [3:0] CLK_COR_SEQ_2_ENABLE = 4'b1111;
+ parameter CLK_COR_SEQ_2_USE = "FALSE";
+ parameter integer CLK_COR_SEQ_LEN = 1;
+ parameter DEC_MCOMMA_DETECT = "TRUE";
+ parameter DEC_PCOMMA_DETECT = "TRUE";
+ parameter DEC_VALID_COMMA_ONLY = "TRUE";
+ parameter [23:0] DMONITOR_CFG = 24'h000A00;
+ parameter [0:0] ES_CLK_PHASE_SEL = 1'b0;
+ parameter [5:0] ES_CONTROL = 6'b000000;
+ parameter ES_ERRDET_EN = "FALSE";
+ parameter ES_EYE_SCAN_EN = "FALSE";
+ parameter [11:0] ES_HORZ_OFFSET = 12'h010;
+ parameter [9:0] ES_PMA_CFG = 10'b0000000000;
+ parameter [4:0] ES_PRESCALE = 5'b00000;
+ parameter [79:0] ES_QUALIFIER = 80'h00000000000000000000;
+ parameter [79:0] ES_QUAL_MASK = 80'h00000000000000000000;
+ parameter [79:0] ES_SDATA_MASK = 80'h00000000000000000000;
+ parameter [8:0] ES_VERT_OFFSET = 9'b000000000;
+ parameter [3:0] FTS_DESKEW_SEQ_ENABLE = 4'b1111;
+ parameter [3:0] FTS_LANE_DESKEW_CFG = 4'b1111;
+ parameter FTS_LANE_DESKEW_EN = "FALSE";
+ parameter [2:0] GEARBOX_MODE = 3'b000;
+ parameter [0:0] IS_CLKRSVD0_INVERTED = 1'b0;
+ parameter [0:0] IS_CLKRSVD1_INVERTED = 1'b0;
+ parameter [0:0] IS_DMONITORCLK_INVERTED = 1'b0;
+ parameter [0:0] IS_DRPCLK_INVERTED = 1'b0;
+ parameter [0:0] IS_RXUSRCLK2_INVERTED = 1'b0;
+ parameter [0:0] IS_RXUSRCLK_INVERTED = 1'b0;
+ parameter [0:0] IS_SIGVALIDCLK_INVERTED = 1'b0;
+ parameter [0:0] IS_TXPHDLYTSTCLK_INVERTED = 1'b0;
+ parameter [0:0] IS_TXUSRCLK2_INVERTED = 1'b0;
+ parameter [0:0] IS_TXUSRCLK_INVERTED = 1'b0;
+ parameter [0:0] LOOPBACK_CFG = 1'b0;
+ parameter [1:0] OUTREFCLK_SEL_INV = 2'b11;
+ parameter PCS_PCIE_EN = "FALSE";
+ parameter [47:0] PCS_RSVD_ATTR = 48'h000000000000;
+ parameter [11:0] PD_TRANS_TIME_FROM_P2 = 12'h03C;
+ parameter [7:0] PD_TRANS_TIME_NONE_P2 = 8'h19;
+ parameter [7:0] PD_TRANS_TIME_TO_P2 = 8'h64;
+ parameter [0:0] PMA_LOOPBACK_CFG = 1'b0;
+ parameter [31:0] PMA_RSV = 32'h00000333;
+ parameter [31:0] PMA_RSV2 = 32'h00002050;
+ parameter [1:0] PMA_RSV3 = 2'b00;
+ parameter [3:0] PMA_RSV4 = 4'b0000;
+ parameter [0:0] PMA_RSV5 = 1'b0;
+ parameter [0:0] PMA_RSV6 = 1'b0;
+ parameter [0:0] PMA_RSV7 = 1'b0;
+ parameter [4:0] RXBUFRESET_TIME = 5'b00001;
+ parameter RXBUF_ADDR_MODE = "FULL";
+ parameter [3:0] RXBUF_EIDLE_HI_CNT = 4'b1000;
+ parameter [3:0] RXBUF_EIDLE_LO_CNT = 4'b0000;
+ parameter RXBUF_EN = "TRUE";
+ parameter RXBUF_RESET_ON_CB_CHANGE = "TRUE";
+ parameter RXBUF_RESET_ON_COMMAALIGN = "FALSE";
+ parameter RXBUF_RESET_ON_EIDLE = "FALSE";
+ parameter RXBUF_RESET_ON_RATE_CHANGE = "TRUE";
+ parameter integer RXBUF_THRESH_OVFLW = 61;
+ parameter RXBUF_THRESH_OVRD = "FALSE";
+ parameter integer RXBUF_THRESH_UNDFLW = 4;
+ parameter [4:0] RXCDRFREQRESET_TIME = 5'b00001;
+ parameter [4:0] RXCDRPHRESET_TIME = 5'b00001;
+ parameter [82:0] RXCDR_CFG = 83'h0000107FE406001041010;
+ parameter [0:0] RXCDR_FR_RESET_ON_EIDLE = 1'b0;
+ parameter [0:0] RXCDR_HOLD_DURING_EIDLE = 1'b0;
+ parameter [5:0] RXCDR_LOCK_CFG = 6'b001001;
+ parameter [0:0] RXCDR_PH_RESET_ON_EIDLE = 1'b0;
+ parameter [15:0] RXDLY_CFG = 16'h0010;
+ parameter [8:0] RXDLY_LCFG = 9'h020;
+ parameter [15:0] RXDLY_TAP_CFG = 16'h0000;
+ parameter RXGEARBOX_EN = "FALSE";
+ parameter [4:0] RXISCANRESET_TIME = 5'b00001;
+ parameter [6:0] RXLPMRESET_TIME = 7'b0001111;
+ parameter [0:0] RXLPM_BIAS_STARTUP_DISABLE = 1'b0;
+ parameter [3:0] RXLPM_CFG = 4'b0110;
+ parameter [0:0] RXLPM_CFG1 = 1'b0;
+ parameter [0:0] RXLPM_CM_CFG = 1'b0;
+ parameter [8:0] RXLPM_GC_CFG = 9'b111100010;
+ parameter [2:0] RXLPM_GC_CFG2 = 3'b001;
+ parameter [13:0] RXLPM_HF_CFG = 14'b00001111110000;
+ parameter [4:0] RXLPM_HF_CFG2 = 5'b01010;
+ parameter [3:0] RXLPM_HF_CFG3 = 4'b0000;
+ parameter [0:0] RXLPM_HOLD_DURING_EIDLE = 1'b0;
+ parameter [0:0] RXLPM_INCM_CFG = 1'b0;
+ parameter [0:0] RXLPM_IPCM_CFG = 1'b0;
+ parameter [17:0] RXLPM_LF_CFG = 18'b000000001111110000;
+ parameter [4:0] RXLPM_LF_CFG2 = 5'b01010;
+ parameter [2:0] RXLPM_OSINT_CFG = 3'b100;
+ parameter [6:0] RXOOB_CFG = 7'b0000110;
+ parameter RXOOB_CLK_CFG = "PMA";
+ parameter [4:0] RXOSCALRESET_TIME = 5'b00011;
+ parameter [4:0] RXOSCALRESET_TIMEOUT = 5'b00000;
+ parameter integer RXOUT_DIV = 2;
+ parameter [4:0] RXPCSRESET_TIME = 5'b00001;
+ parameter [23:0] RXPHDLY_CFG = 24'h084000;
+ parameter [23:0] RXPH_CFG = 24'hC00002;
+ parameter [4:0] RXPH_MONITOR_SEL = 5'b00000;
+ parameter [2:0] RXPI_CFG0 = 3'b000;
+ parameter [0:0] RXPI_CFG1 = 1'b0;
+ parameter [0:0] RXPI_CFG2 = 1'b0;
+ parameter [4:0] RXPMARESET_TIME = 5'b00011;
+ parameter [0:0] RXPRBS_ERR_LOOPBACK = 1'b0;
+ parameter integer RXSLIDE_AUTO_WAIT = 7;
+ parameter RXSLIDE_MODE = "OFF";
+ parameter [0:0] RXSYNC_MULTILANE = 1'b0;
+ parameter [0:0] RXSYNC_OVRD = 1'b0;
+ parameter [0:0] RXSYNC_SKIP_DA = 1'b0;
+ parameter [15:0] RX_BIAS_CFG = 16'b0000111100110011;
+ parameter [5:0] RX_BUFFER_CFG = 6'b000000;
+ parameter integer RX_CLK25_DIV = 7;
+ parameter [0:0] RX_CLKMUX_EN = 1'b1;
+ parameter [1:0] RX_CM_SEL = 2'b11;
+ parameter [3:0] RX_CM_TRIM = 4'b0100;
+ parameter integer RX_DATA_WIDTH = 20;
+ parameter [5:0] RX_DDI_SEL = 6'b000000;
+ parameter [13:0] RX_DEBUG_CFG = 14'b00000000000000;
+ parameter RX_DEFER_RESET_BUF_EN = "TRUE";
+ parameter RX_DISPERR_SEQ_MATCH = "TRUE";
+ parameter [12:0] RX_OS_CFG = 13'b0001111110000;
+ parameter integer RX_SIG_VALID_DLY = 10;
+ parameter RX_XCLK_SEL = "RXREC";
+ parameter integer SAS_MAX_COM = 64;
+ parameter integer SAS_MIN_COM = 36;
+ parameter [3:0] SATA_BURST_SEQ_LEN = 4'b1111;
+ parameter [2:0] SATA_BURST_VAL = 3'b100;
+ parameter [2:0] SATA_EIDLE_VAL = 3'b100;
+ parameter integer SATA_MAX_BURST = 8;
+ parameter integer SATA_MAX_INIT = 21;
+ parameter integer SATA_MAX_WAKE = 7;
+ parameter integer SATA_MIN_BURST = 4;
+ parameter integer SATA_MIN_INIT = 12;
+ parameter integer SATA_MIN_WAKE = 4;
+ parameter SATA_PLL_CFG = "VCO_3000MHZ";
+ parameter SHOW_REALIGN_COMMA = "TRUE";
+ parameter SIM_RECEIVER_DETECT_PASS = "TRUE";
+ parameter SIM_RESET_SPEEDUP = "TRUE";
+ parameter SIM_TX_EIDLE_DRIVE_LEVEL = "X";
+ parameter SIM_VERSION = "1.0";
+ parameter [14:0] TERM_RCAL_CFG = 15'b100001000010000;
+ parameter [2:0] TERM_RCAL_OVRD = 3'b000;
+ parameter [7:0] TRANS_TIME_RATE = 8'h0E;
+ parameter [31:0] TST_RSV = 32'h00000000;
+ parameter TXBUF_EN = "TRUE";
+ parameter TXBUF_RESET_ON_RATE_CHANGE = "FALSE";
+ parameter [15:0] TXDLY_CFG = 16'h0010;
+ parameter [8:0] TXDLY_LCFG = 9'h020;
+ parameter [15:0] TXDLY_TAP_CFG = 16'h0000;
+ parameter TXGEARBOX_EN = "FALSE";
+ parameter [0:0] TXOOB_CFG = 1'b0;
+ parameter integer TXOUT_DIV = 2;
+ parameter [4:0] TXPCSRESET_TIME = 5'b00001;
+ parameter [23:0] TXPHDLY_CFG = 24'h084000;
+ parameter [15:0] TXPH_CFG = 16'h0400;
+ parameter [4:0] TXPH_MONITOR_SEL = 5'b00000;
+ parameter [1:0] TXPI_CFG0 = 2'b00;
+ parameter [1:0] TXPI_CFG1 = 2'b00;
+ parameter [1:0] TXPI_CFG2 = 2'b00;
+ parameter [0:0] TXPI_CFG3 = 1'b0;
+ parameter [0:0] TXPI_CFG4 = 1'b0;
+ parameter [2:0] TXPI_CFG5 = 3'b000;
+ parameter [0:0] TXPI_GREY_SEL = 1'b0;
+ parameter [0:0] TXPI_INVSTROBE_SEL = 1'b0;
+ parameter TXPI_PPMCLK_SEL = "TXUSRCLK2";
+ parameter [7:0] TXPI_PPM_CFG = 8'b00000000;
+ parameter [2:0] TXPI_SYNFREQ_PPM = 3'b000;
+ parameter [4:0] TXPMARESET_TIME = 5'b00001;
+ parameter [0:0] TXSYNC_MULTILANE = 1'b0;
+ parameter [0:0] TXSYNC_OVRD = 1'b0;
+ parameter [0:0] TXSYNC_SKIP_DA = 1'b0;
+ parameter integer TX_CLK25_DIV = 7;
+ parameter [0:0] TX_CLKMUX_EN = 1'b1;
+ parameter integer TX_DATA_WIDTH = 20;
+ parameter [5:0] TX_DEEMPH0 = 6'b000000;
+ parameter [5:0] TX_DEEMPH1 = 6'b000000;
+ parameter TX_DRIVE_MODE = "DIRECT";
+ parameter [2:0] TX_EIDLE_ASSERT_DELAY = 3'b110;
+ parameter [2:0] TX_EIDLE_DEASSERT_DELAY = 3'b100;
+ parameter TX_LOOPBACK_DRIVE_HIZ = "FALSE";
+ parameter [0:0] TX_MAINCURSOR_SEL = 1'b0;
+ parameter [6:0] TX_MARGIN_FULL_0 = 7'b1001110;
+ parameter [6:0] TX_MARGIN_FULL_1 = 7'b1001001;
+ parameter [6:0] TX_MARGIN_FULL_2 = 7'b1000101;
+ parameter [6:0] TX_MARGIN_FULL_3 = 7'b1000010;
+ parameter [6:0] TX_MARGIN_FULL_4 = 7'b1000000;
+ parameter [6:0] TX_MARGIN_LOW_0 = 7'b1000110;
+ parameter [6:0] TX_MARGIN_LOW_1 = 7'b1000100;
+ parameter [6:0] TX_MARGIN_LOW_2 = 7'b1000010;
+ parameter [6:0] TX_MARGIN_LOW_3 = 7'b1000000;
+ parameter [6:0] TX_MARGIN_LOW_4 = 7'b1000000;
+ parameter [0:0] TX_PREDRIVER_MODE = 1'b0;
+ parameter [13:0] TX_RXDETECT_CFG = 14'h1832;
+ parameter [2:0] TX_RXDETECT_REF = 3'b100;
+ parameter TX_XCLK_SEL = "TXUSR";
+ parameter [0:0] UCODEER_CLR = 1'b0;
+ parameter [0:0] USE_PCS_CLK_PHASE_SEL = 1'b0;
+ output DRPRDY;
+ output EYESCANDATAERROR;
+ output GTPTXN;
+ output GTPTXP;
+ output PHYSTATUS;
+ output PMARSVDOUT0;
+ output PMARSVDOUT1;
+ output RXBYTEISALIGNED;
+ output RXBYTEREALIGN;
+ output RXCDRLOCK;
+ output RXCHANBONDSEQ;
+ output RXCHANISALIGNED;
+ output RXCHANREALIGN;
+ output RXCOMINITDET;
+ output RXCOMMADET;
+ output RXCOMSASDET;
+ output RXCOMWAKEDET;
+ output RXDLYSRESETDONE;
+ output RXELECIDLE;
+ output RXHEADERVALID;
+ output RXOSINTDONE;
+ output RXOSINTSTARTED;
+ output RXOSINTSTROBEDONE;
+ output RXOSINTSTROBESTARTED;
+ output RXOUTCLK;
+ output RXOUTCLKFABRIC;
+ output RXOUTCLKPCS;
+ output RXPHALIGNDONE;
+ output RXPMARESETDONE;
+ output RXPRBSERR;
+ output RXRATEDONE;
+ output RXRESETDONE;
+ output RXSYNCDONE;
+ output RXSYNCOUT;
+ output RXVALID;
+ output TXCOMFINISH;
+ output TXDLYSRESETDONE;
+ output TXGEARBOXREADY;
+ output TXOUTCLK;
+ output TXOUTCLKFABRIC;
+ output TXOUTCLKPCS;
+ output TXPHALIGNDONE;
+ output TXPHINITDONE;
+ output TXPMARESETDONE;
+ output TXRATEDONE;
+ output TXRESETDONE;
+ output TXSYNCDONE;
+ output TXSYNCOUT;
+ output [14:0] DMONITOROUT;
+ output [15:0] DRPDO;
+ output [15:0] PCSRSVDOUT;
+ output [1:0] RXCLKCORCNT;
+ output [1:0] RXDATAVALID;
+ output [1:0] RXSTARTOFSEQ;
+ output [1:0] TXBUFSTATUS;
+ output [2:0] RXBUFSTATUS;
+ output [2:0] RXHEADER;
+ output [2:0] RXSTATUS;
+ output [31:0] RXDATA;
+ output [3:0] RXCHARISCOMMA;
+ output [3:0] RXCHARISK;
+ output [3:0] RXCHBONDO;
+ output [3:0] RXDISPERR;
+ output [3:0] RXNOTINTABLE;
+ output [4:0] RXPHMONITOR;
+ output [4:0] RXPHSLIPMONITOR;
+ input CFGRESET;
+ input CLKRSVD0;
+ input CLKRSVD1;
+ input DMONFIFORESET;
+ input DMONITORCLK;
+ input DRPCLK;
+ input DRPEN;
+ input DRPWE;
+ input EYESCANMODE;
+ input EYESCANRESET;
+ input EYESCANTRIGGER;
+ input GTPRXN;
+ input GTPRXP;
+ input GTRESETSEL;
+ input GTRXRESET;
+ input GTTXRESET;
+ input PLL0CLK;
+ input PLL0REFCLK;
+ input PLL1CLK;
+ input PLL1REFCLK;
+ input PMARSVDIN0;
+ input PMARSVDIN1;
+ input PMARSVDIN2;
+ input PMARSVDIN3;
+ input PMARSVDIN4;
+ input RESETOVRD;
+ input RX8B10BEN;
+ input RXBUFRESET;
+ input RXCDRFREQRESET;
+ input RXCDRHOLD;
+ input RXCDROVRDEN;
+ input RXCDRRESET;
+ input RXCDRRESETRSV;
+ input RXCHBONDEN;
+ input RXCHBONDMASTER;
+ input RXCHBONDSLAVE;
+ input RXCOMMADETEN;
+ input RXDDIEN;
+ input RXDFEXYDEN;
+ input RXDLYBYPASS;
+ input RXDLYEN;
+ input RXDLYOVRDEN;
+ input RXDLYSRESET;
+ input RXGEARBOXSLIP;
+ input RXLPMHFHOLD;
+ input RXLPMHFOVRDEN;
+ input RXLPMLFHOLD;
+ input RXLPMLFOVRDEN;
+ input RXLPMOSINTNTRLEN;
+ input RXLPMRESET;
+ input RXMCOMMAALIGNEN;
+ input RXOOBRESET;
+ input RXOSCALRESET;
+ input RXOSHOLD;
+ input RXOSINTEN;
+ input RXOSINTHOLD;
+ input RXOSINTNTRLEN;
+ input RXOSINTOVRDEN;
+ input RXOSINTPD;
+ input RXOSINTSTROBE;
+ input RXOSINTTESTOVRDEN;
+ input RXOSOVRDEN;
+ input RXPCOMMAALIGNEN;
+ input RXPCSRESET;
+ input RXPHALIGN;
+ input RXPHALIGNEN;
+ input RXPHDLYPD;
+ input RXPHDLYRESET;
+ input RXPHOVRDEN;
+ input RXPMARESET;
+ input RXPOLARITY;
+ input RXPRBSCNTRESET;
+ input RXRATEMODE;
+ input RXSLIDE;
+ input RXSYNCALLIN;
+ input RXSYNCIN;
+ input RXSYNCMODE;
+ input RXUSERRDY;
+ input RXUSRCLK2;
+ input RXUSRCLK;
+ input SETERRSTATUS;
+ input SIGVALIDCLK;
+ input TX8B10BEN;
+ input TXCOMINIT;
+ input TXCOMSAS;
+ input TXCOMWAKE;
+ input TXDEEMPH;
+ input TXDETECTRX;
+ input TXDIFFPD;
+ input TXDLYBYPASS;
+ input TXDLYEN;
+ input TXDLYHOLD;
+ input TXDLYOVRDEN;
+ input TXDLYSRESET;
+ input TXDLYUPDOWN;
+ input TXELECIDLE;
+ input TXINHIBIT;
+ input TXPCSRESET;
+ input TXPDELECIDLEMODE;
+ input TXPHALIGN;
+ input TXPHALIGNEN;
+ input TXPHDLYPD;
+ input TXPHDLYRESET;
+ input TXPHDLYTSTCLK;
+ input TXPHINIT;
+ input TXPHOVRDEN;
+ input TXPIPPMEN;
+ input TXPIPPMOVRDEN;
+ input TXPIPPMPD;
+ input TXPIPPMSEL;
+ input TXPISOPD;
+ input TXPMARESET;
+ input TXPOLARITY;
+ input TXPOSTCURSORINV;
+ input TXPRBSFORCEERR;
+ input TXPRECURSORINV;
+ input TXRATEMODE;
+ input TXSTARTSEQ;
+ input TXSWING;
+ input TXSYNCALLIN;
+ input TXSYNCIN;
+ input TXSYNCMODE;
+ input TXUSERRDY;
+ input TXUSRCLK2;
+ input TXUSRCLK;
+ input [13:0] RXADAPTSELTEST;
+ input [15:0] DRPDI;
+ input [15:0] GTRSVD;
+ input [15:0] PCSRSVDIN;
+ input [19:0] TSTIN;
+ input [1:0] RXELECIDLEMODE;
+ input [1:0] RXPD;
+ input [1:0] RXSYSCLKSEL;
+ input [1:0] TXPD;
+ input [1:0] TXSYSCLKSEL;
+ input [2:0] LOOPBACK;
+ input [2:0] RXCHBONDLEVEL;
+ input [2:0] RXOUTCLKSEL;
+ input [2:0] RXPRBSSEL;
+ input [2:0] RXRATE;
+ input [2:0] TXBUFDIFFCTRL;
+ input [2:0] TXHEADER;
+ input [2:0] TXMARGIN;
+ input [2:0] TXOUTCLKSEL;
+ input [2:0] TXPRBSSEL;
+ input [2:0] TXRATE;
+ input [31:0] TXDATA;
+ input [3:0] RXCHBONDI;
+ input [3:0] RXOSINTCFG;
+ input [3:0] RXOSINTID0;
+ input [3:0] TX8B10BBYPASS;
+ input [3:0] TXCHARDISPMODE;
+ input [3:0] TXCHARDISPVAL;
+ input [3:0] TXCHARISK;
+ input [3:0] TXDIFFCTRL;
+ input [4:0] TXPIPPMSTEPSIZE;
+ input [4:0] TXPOSTCURSOR;
+ input [4:0] TXPRECURSOR;
+ input [6:0] TXMAINCURSOR;
+ input [6:0] TXSEQUENCE;
+ input [8:0] DRPADDR;
+endmodule
+
+module GTPE2_COMMON (...);
+ parameter [63:0] BIAS_CFG = 64'h0000000000000000;
+ parameter [31:0] COMMON_CFG = 32'h00000000;
+ parameter [0:0] IS_DRPCLK_INVERTED = 1'b0;
+ parameter [0:0] IS_GTGREFCLK0_INVERTED = 1'b0;
+ parameter [0:0] IS_GTGREFCLK1_INVERTED = 1'b0;
+ parameter [0:0] IS_PLL0LOCKDETCLK_INVERTED = 1'b0;
+ parameter [0:0] IS_PLL1LOCKDETCLK_INVERTED = 1'b0;
+ parameter [26:0] PLL0_CFG = 27'h01F03DC;
+ parameter [0:0] PLL0_DMON_CFG = 1'b0;
+ parameter integer PLL0_FBDIV = 4;
+ parameter integer PLL0_FBDIV_45 = 5;
+ parameter [23:0] PLL0_INIT_CFG = 24'h00001E;
+ parameter [8:0] PLL0_LOCK_CFG = 9'h1E8;
+ parameter integer PLL0_REFCLK_DIV = 1;
+ parameter [26:0] PLL1_CFG = 27'h01F03DC;
+ parameter [0:0] PLL1_DMON_CFG = 1'b0;
+ parameter integer PLL1_FBDIV = 4;
+ parameter integer PLL1_FBDIV_45 = 5;
+ parameter [23:0] PLL1_INIT_CFG = 24'h00001E;
+ parameter [8:0] PLL1_LOCK_CFG = 9'h1E8;
+ parameter integer PLL1_REFCLK_DIV = 1;
+ parameter [7:0] PLL_CLKOUT_CFG = 8'b00000000;
+ parameter [15:0] RSVD_ATTR0 = 16'h0000;
+ parameter [15:0] RSVD_ATTR1 = 16'h0000;
+ parameter [2:0] SIM_PLL0REFCLK_SEL = 3'b001;
+ parameter [2:0] SIM_PLL1REFCLK_SEL = 3'b001;
+ parameter SIM_RESET_SPEEDUP = "TRUE";
+ parameter SIM_VERSION = "1.0";
+ output DRPRDY;
+ output PLL0FBCLKLOST;
+ output PLL0LOCK;
+ output PLL0OUTCLK;
+ output PLL0OUTREFCLK;
+ output PLL0REFCLKLOST;
+ output PLL1FBCLKLOST;
+ output PLL1LOCK;
+ output PLL1OUTCLK;
+ output PLL1OUTREFCLK;
+ output PLL1REFCLKLOST;
+ output REFCLKOUTMONITOR0;
+ output REFCLKOUTMONITOR1;
+ output [15:0] DRPDO;
+ output [15:0] PMARSVDOUT;
+ output [7:0] DMONITOROUT;
+ input BGBYPASSB;
+ input BGMONITORENB;
+ input BGPDB;
+ input BGRCALOVRDENB;
+ input DRPCLK;
+ input DRPEN;
+ input DRPWE;
+ input GTEASTREFCLK0;
+ input GTEASTREFCLK1;
+ input GTGREFCLK0;
+ input GTGREFCLK1;
+ input GTREFCLK0;
+ input GTREFCLK1;
+ input GTWESTREFCLK0;
+ input GTWESTREFCLK1;
+ input PLL0LOCKDETCLK;
+ input PLL0LOCKEN;
+ input PLL0PD;
+ input PLL0RESET;
+ input PLL1LOCKDETCLK;
+ input PLL1LOCKEN;
+ input PLL1PD;
+ input PLL1RESET;
+ input RCALENB;
+ input [15:0] DRPDI;
+ input [15:0] PLLRSVD1;
+ input [2:0] PLL0REFCLKSEL;
+ input [2:0] PLL1REFCLKSEL;
+ input [4:0] BGRCALOVRD;
+ input [4:0] PLLRSVD2;
+ input [7:0] DRPADDR;
+ input [7:0] PMARSVD;
+endmodule
+
+module GTXE2_CHANNEL (...);
+ parameter ALIGN_COMMA_DOUBLE = "FALSE";
+ parameter [9:0] ALIGN_COMMA_ENABLE = 10'b0001111111;
+ parameter integer ALIGN_COMMA_WORD = 1;
+ parameter ALIGN_MCOMMA_DET = "TRUE";
+ parameter [9:0] ALIGN_MCOMMA_VALUE = 10'b1010000011;
+ parameter ALIGN_PCOMMA_DET = "TRUE";
+ parameter [9:0] ALIGN_PCOMMA_VALUE = 10'b0101111100;
+ parameter CBCC_DATA_SOURCE_SEL = "DECODED";
+ parameter CHAN_BOND_KEEP_ALIGN = "FALSE";
+ parameter integer CHAN_BOND_MAX_SKEW = 7;
+ parameter [9:0] CHAN_BOND_SEQ_1_1 = 10'b0101111100;
+ parameter [9:0] CHAN_BOND_SEQ_1_2 = 10'b0000000000;
+ parameter [9:0] CHAN_BOND_SEQ_1_3 = 10'b0000000000;
+ parameter [9:0] CHAN_BOND_SEQ_1_4 = 10'b0000000000;
+ parameter [3:0] CHAN_BOND_SEQ_1_ENABLE = 4'b1111;
+ parameter [9:0] CHAN_BOND_SEQ_2_1 = 10'b0100000000;
+ parameter [9:0] CHAN_BOND_SEQ_2_2 = 10'b0100000000;
+ parameter [9:0] CHAN_BOND_SEQ_2_3 = 10'b0100000000;
+ parameter [9:0] CHAN_BOND_SEQ_2_4 = 10'b0100000000;
+ parameter [3:0] CHAN_BOND_SEQ_2_ENABLE = 4'b1111;
+ parameter CHAN_BOND_SEQ_2_USE = "FALSE";
+ parameter integer CHAN_BOND_SEQ_LEN = 1;
+ parameter CLK_CORRECT_USE = "TRUE";
+ parameter CLK_COR_KEEP_IDLE = "FALSE";
+ parameter integer CLK_COR_MAX_LAT = 20;
+ parameter integer CLK_COR_MIN_LAT = 18;
+ parameter CLK_COR_PRECEDENCE = "TRUE";
+ parameter integer CLK_COR_REPEAT_WAIT = 0;
+ parameter [9:0] CLK_COR_SEQ_1_1 = 10'b0100011100;
+ parameter [9:0] CLK_COR_SEQ_1_2 = 10'b0000000000;
+ parameter [9:0] CLK_COR_SEQ_1_3 = 10'b0000000000;
+ parameter [9:0] CLK_COR_SEQ_1_4 = 10'b0000000000;
+ parameter [3:0] CLK_COR_SEQ_1_ENABLE = 4'b1111;
+ parameter [9:0] CLK_COR_SEQ_2_1 = 10'b0100000000;
+ parameter [9:0] CLK_COR_SEQ_2_2 = 10'b0100000000;
+ parameter [9:0] CLK_COR_SEQ_2_3 = 10'b0100000000;
+ parameter [9:0] CLK_COR_SEQ_2_4 = 10'b0100000000;
+ parameter [3:0] CLK_COR_SEQ_2_ENABLE = 4'b1111;
+ parameter CLK_COR_SEQ_2_USE = "FALSE";
+ parameter integer CLK_COR_SEQ_LEN = 1;
+ parameter [23:0] CPLL_CFG = 24'hB007D8;
+ parameter integer CPLL_FBDIV = 4;
+ parameter integer CPLL_FBDIV_45 = 5;
+ parameter [23:0] CPLL_INIT_CFG = 24'h00001E;
+ parameter [15:0] CPLL_LOCK_CFG = 16'h01E8;
+ parameter integer CPLL_REFCLK_DIV = 1;
+ parameter DEC_MCOMMA_DETECT = "TRUE";
+ parameter DEC_PCOMMA_DETECT = "TRUE";
+ parameter DEC_VALID_COMMA_ONLY = "TRUE";
+ parameter [23:0] DMONITOR_CFG = 24'h000A00;
+ parameter [5:0] ES_CONTROL = 6'b000000;
+ parameter ES_ERRDET_EN = "FALSE";
+ parameter ES_EYE_SCAN_EN = "FALSE";
+ parameter [11:0] ES_HORZ_OFFSET = 12'h000;
+ parameter [9:0] ES_PMA_CFG = 10'b0000000000;
+ parameter [4:0] ES_PRESCALE = 5'b00000;
+ parameter [79:0] ES_QUALIFIER = 80'h00000000000000000000;
+ parameter [79:0] ES_QUAL_MASK = 80'h00000000000000000000;
+ parameter [79:0] ES_SDATA_MASK = 80'h00000000000000000000;
+ parameter [8:0] ES_VERT_OFFSET = 9'b000000000;
+ parameter [3:0] FTS_DESKEW_SEQ_ENABLE = 4'b1111;
+ parameter [3:0] FTS_LANE_DESKEW_CFG = 4'b1111;
+ parameter FTS_LANE_DESKEW_EN = "FALSE";
+ parameter [2:0] GEARBOX_MODE = 3'b000;
+ parameter [0:0] IS_CPLLLOCKDETCLK_INVERTED = 1'b0;
+ parameter [0:0] IS_DRPCLK_INVERTED = 1'b0;
+ parameter [0:0] IS_GTGREFCLK_INVERTED = 1'b0;
+ parameter [0:0] IS_RXUSRCLK2_INVERTED = 1'b0;
+ parameter [0:0] IS_RXUSRCLK_INVERTED = 1'b0;
+ parameter [0:0] IS_TXPHDLYTSTCLK_INVERTED = 1'b0;
+ parameter [0:0] IS_TXUSRCLK2_INVERTED = 1'b0;
+ parameter [0:0] IS_TXUSRCLK_INVERTED = 1'b0;
+ parameter [1:0] OUTREFCLK_SEL_INV = 2'b11;
+ parameter PCS_PCIE_EN = "FALSE";
+ parameter [47:0] PCS_RSVD_ATTR = 48'h000000000000;
+ parameter [11:0] PD_TRANS_TIME_FROM_P2 = 12'h03C;
+ parameter [7:0] PD_TRANS_TIME_NONE_P2 = 8'h19;
+ parameter [7:0] PD_TRANS_TIME_TO_P2 = 8'h64;
+ parameter [31:0] PMA_RSV = 32'h00000000;
+ parameter [15:0] PMA_RSV2 = 16'h2050;
+ parameter [1:0] PMA_RSV3 = 2'b00;
+ parameter [31:0] PMA_RSV4 = 32'h00000000;
+ parameter [4:0] RXBUFRESET_TIME = 5'b00001;
+ parameter RXBUF_ADDR_MODE = "FULL";
+ parameter [3:0] RXBUF_EIDLE_HI_CNT = 4'b1000;
+ parameter [3:0] RXBUF_EIDLE_LO_CNT = 4'b0000;
+ parameter RXBUF_EN = "TRUE";
+ parameter RXBUF_RESET_ON_CB_CHANGE = "TRUE";
+ parameter RXBUF_RESET_ON_COMMAALIGN = "FALSE";
+ parameter RXBUF_RESET_ON_EIDLE = "FALSE";
+ parameter RXBUF_RESET_ON_RATE_CHANGE = "TRUE";
+ parameter integer RXBUF_THRESH_OVFLW = 61;
+ parameter RXBUF_THRESH_OVRD = "FALSE";
+ parameter integer RXBUF_THRESH_UNDFLW = 4;
+ parameter [4:0] RXCDRFREQRESET_TIME = 5'b00001;
+ parameter [4:0] RXCDRPHRESET_TIME = 5'b00001;
+ parameter [71:0] RXCDR_CFG = 72'h0B000023FF20400020;
+ parameter [0:0] RXCDR_FR_RESET_ON_EIDLE = 1'b0;
+ parameter [0:0] RXCDR_HOLD_DURING_EIDLE = 1'b0;
+ parameter [5:0] RXCDR_LOCK_CFG = 6'b010101;
+ parameter [0:0] RXCDR_PH_RESET_ON_EIDLE = 1'b0;
+ parameter [6:0] RXDFELPMRESET_TIME = 7'b0001111;
+ parameter [15:0] RXDLY_CFG = 16'h001F;
+ parameter [8:0] RXDLY_LCFG = 9'h030;
+ parameter [15:0] RXDLY_TAP_CFG = 16'h0000;
+ parameter RXGEARBOX_EN = "FALSE";
+ parameter [4:0] RXISCANRESET_TIME = 5'b00001;
+ parameter [13:0] RXLPM_HF_CFG = 14'b00000011110000;
+ parameter [13:0] RXLPM_LF_CFG = 14'b00000011110000;
+ parameter [6:0] RXOOB_CFG = 7'b0000110;
+ parameter integer RXOUT_DIV = 2;
+ parameter [4:0] RXPCSRESET_TIME = 5'b00001;
+ parameter [23:0] RXPHDLY_CFG = 24'h084020;
+ parameter [23:0] RXPH_CFG = 24'h000000;
+ parameter [4:0] RXPH_MONITOR_SEL = 5'b00000;
+ parameter [4:0] RXPMARESET_TIME = 5'b00011;
+ parameter [0:0] RXPRBS_ERR_LOOPBACK = 1'b0;
+ parameter integer RXSLIDE_AUTO_WAIT = 7;
+ parameter RXSLIDE_MODE = "OFF";
+ parameter [11:0] RX_BIAS_CFG = 12'b000000000000;
+ parameter [5:0] RX_BUFFER_CFG = 6'b000000;
+ parameter integer RX_CLK25_DIV = 7;
+ parameter [0:0] RX_CLKMUX_PD = 1'b1;
+ parameter [1:0] RX_CM_SEL = 2'b11;
+ parameter [2:0] RX_CM_TRIM = 3'b100;
+ parameter integer RX_DATA_WIDTH = 20;
+ parameter [5:0] RX_DDI_SEL = 6'b000000;
+ parameter [11:0] RX_DEBUG_CFG = 12'b000000000000;
+ parameter RX_DEFER_RESET_BUF_EN = "TRUE";
+ parameter [22:0] RX_DFE_GAIN_CFG = 23'h180E0F;
+ parameter [11:0] RX_DFE_H2_CFG = 12'b000111100000;
+ parameter [11:0] RX_DFE_H3_CFG = 12'b000111100000;
+ parameter [10:0] RX_DFE_H4_CFG = 11'b00011110000;
+ parameter [10:0] RX_DFE_H5_CFG = 11'b00011110000;
+ parameter [12:0] RX_DFE_KL_CFG = 13'b0001111110000;
+ parameter [31:0] RX_DFE_KL_CFG2 = 32'h3008E56A;
+ parameter [15:0] RX_DFE_LPM_CFG = 16'h0904;
+ parameter [0:0] RX_DFE_LPM_HOLD_DURING_EIDLE = 1'b0;
+ parameter [16:0] RX_DFE_UT_CFG = 17'b00111111000000000;
+ parameter [16:0] RX_DFE_VP_CFG = 17'b00011111100000000;
+ parameter [12:0] RX_DFE_XYD_CFG = 13'b0000000010000;
+ parameter RX_DISPERR_SEQ_MATCH = "TRUE";
+ parameter integer RX_INT_DATAWIDTH = 0;
+ parameter [12:0] RX_OS_CFG = 13'b0001111110000;
+ parameter integer RX_SIG_VALID_DLY = 10;
+ parameter RX_XCLK_SEL = "RXREC";
+ parameter integer SAS_MAX_COM = 64;
+ parameter integer SAS_MIN_COM = 36;
+ parameter [3:0] SATA_BURST_SEQ_LEN = 4'b1111;
+ parameter [2:0] SATA_BURST_VAL = 3'b100;
+ parameter SATA_CPLL_CFG = "VCO_3000MHZ";
+ parameter [2:0] SATA_EIDLE_VAL = 3'b100;
+ parameter integer SATA_MAX_BURST = 8;
+ parameter integer SATA_MAX_INIT = 21;
+ parameter integer SATA_MAX_WAKE = 7;
+ parameter integer SATA_MIN_BURST = 4;
+ parameter integer SATA_MIN_INIT = 12;
+ parameter integer SATA_MIN_WAKE = 4;
+ parameter SHOW_REALIGN_COMMA = "TRUE";
+ parameter [2:0] SIM_CPLLREFCLK_SEL = 3'b001;
+ parameter SIM_RECEIVER_DETECT_PASS = "TRUE";
+ parameter SIM_RESET_SPEEDUP = "TRUE";
+ parameter SIM_TX_EIDLE_DRIVE_LEVEL = "X";
+ parameter SIM_VERSION = "4.0";
+ parameter [4:0] TERM_RCAL_CFG = 5'b10000;
+ parameter [0:0] TERM_RCAL_OVRD = 1'b0;
+ parameter [7:0] TRANS_TIME_RATE = 8'h0E;
+ parameter [31:0] TST_RSV = 32'h00000000;
+ parameter TXBUF_EN = "TRUE";
+ parameter TXBUF_RESET_ON_RATE_CHANGE = "FALSE";
+ parameter [15:0] TXDLY_CFG = 16'h001F;
+ parameter [8:0] TXDLY_LCFG = 9'h030;
+ parameter [15:0] TXDLY_TAP_CFG = 16'h0000;
+ parameter TXGEARBOX_EN = "FALSE";
+ parameter integer TXOUT_DIV = 2;
+ parameter [4:0] TXPCSRESET_TIME = 5'b00001;
+ parameter [23:0] TXPHDLY_CFG = 24'h084020;
+ parameter [15:0] TXPH_CFG = 16'h0780;
+ parameter [4:0] TXPH_MONITOR_SEL = 5'b00000;
+ parameter [4:0] TXPMARESET_TIME = 5'b00001;
+ parameter integer TX_CLK25_DIV = 7;
+ parameter [0:0] TX_CLKMUX_PD = 1'b1;
+ parameter integer TX_DATA_WIDTH = 20;
+ parameter [4:0] TX_DEEMPH0 = 5'b00000;
+ parameter [4:0] TX_DEEMPH1 = 5'b00000;
+ parameter TX_DRIVE_MODE = "DIRECT";
+ parameter [2:0] TX_EIDLE_ASSERT_DELAY = 3'b110;
+ parameter [2:0] TX_EIDLE_DEASSERT_DELAY = 3'b100;
+ parameter integer TX_INT_DATAWIDTH = 0;
+ parameter TX_LOOPBACK_DRIVE_HIZ = "FALSE";
+ parameter [0:0] TX_MAINCURSOR_SEL = 1'b0;
+ parameter [6:0] TX_MARGIN_FULL_0 = 7'b1001110;
+ parameter [6:0] TX_MARGIN_FULL_1 = 7'b1001001;
+ parameter [6:0] TX_MARGIN_FULL_2 = 7'b1000101;
+ parameter [6:0] TX_MARGIN_FULL_3 = 7'b1000010;
+ parameter [6:0] TX_MARGIN_FULL_4 = 7'b1000000;
+ parameter [6:0] TX_MARGIN_LOW_0 = 7'b1000110;
+ parameter [6:0] TX_MARGIN_LOW_1 = 7'b1000100;
+ parameter [6:0] TX_MARGIN_LOW_2 = 7'b1000010;
+ parameter [6:0] TX_MARGIN_LOW_3 = 7'b1000000;
+ parameter [6:0] TX_MARGIN_LOW_4 = 7'b1000000;
+ parameter [0:0] TX_PREDRIVER_MODE = 1'b0;
+ parameter [0:0] TX_QPI_STATUS_EN = 1'b0;
+ parameter [13:0] TX_RXDETECT_CFG = 14'h1832;
+ parameter [2:0] TX_RXDETECT_REF = 3'b100;
+ parameter TX_XCLK_SEL = "TXUSR";
+ parameter [0:0] UCODEER_CLR = 1'b0;
+ output CPLLFBCLKLOST;
+ output CPLLLOCK;
+ output CPLLREFCLKLOST;
+ output DRPRDY;
+ output EYESCANDATAERROR;
+ output GTREFCLKMONITOR;
+ output GTXTXN;
+ output GTXTXP;
+ output PHYSTATUS;
+ output RXBYTEISALIGNED;
+ output RXBYTEREALIGN;
+ output RXCDRLOCK;
+ output RXCHANBONDSEQ;
+ output RXCHANISALIGNED;
+ output RXCHANREALIGN;
+ output RXCOMINITDET;
+ output RXCOMMADET;
+ output RXCOMSASDET;
+ output RXCOMWAKEDET;
+ output RXDATAVALID;
+ output RXDLYSRESETDONE;
+ output RXELECIDLE;
+ output RXHEADERVALID;
+ output RXOUTCLK;
+ output RXOUTCLKFABRIC;
+ output RXOUTCLKPCS;
+ output RXPHALIGNDONE;
+ output RXPRBSERR;
+ output RXQPISENN;
+ output RXQPISENP;
+ output RXRATEDONE;
+ output RXRESETDONE;
+ output RXSTARTOFSEQ;
+ output RXVALID;
+ output TXCOMFINISH;
+ output TXDLYSRESETDONE;
+ output TXGEARBOXREADY;
+ output TXOUTCLK;
+ output TXOUTCLKFABRIC;
+ output TXOUTCLKPCS;
+ output TXPHALIGNDONE;
+ output TXPHINITDONE;
+ output TXQPISENN;
+ output TXQPISENP;
+ output TXRATEDONE;
+ output TXRESETDONE;
+ output [15:0] DRPDO;
+ output [15:0] PCSRSVDOUT;
+ output [1:0] RXCLKCORCNT;
+ output [1:0] TXBUFSTATUS;
+ output [2:0] RXBUFSTATUS;
+ output [2:0] RXHEADER;
+ output [2:0] RXSTATUS;
+ output [4:0] RXCHBONDO;
+ output [4:0] RXPHMONITOR;
+ output [4:0] RXPHSLIPMONITOR;
+ output [63:0] RXDATA;
+ output [6:0] RXMONITOROUT;
+ output [7:0] DMONITOROUT;
+ output [7:0] RXCHARISCOMMA;
+ output [7:0] RXCHARISK;
+ output [7:0] RXDISPERR;
+ output [7:0] RXNOTINTABLE;
+ output [9:0] TSTOUT;
+ input CFGRESET;
+ input CPLLLOCKDETCLK;
+ input CPLLLOCKEN;
+ input CPLLPD;
+ input CPLLRESET;
+ input DRPCLK;
+ input DRPEN;
+ input DRPWE;
+ input EYESCANMODE;
+ input EYESCANRESET;
+ input EYESCANTRIGGER;
+ input GTGREFCLK;
+ input GTNORTHREFCLK0;
+ input GTNORTHREFCLK1;
+ input GTREFCLK0;
+ input GTREFCLK1;
+ input GTRESETSEL;
+ input GTRXRESET;
+ input GTSOUTHREFCLK0;
+ input GTSOUTHREFCLK1;
+ input GTTXRESET;
+ input GTXRXN;
+ input GTXRXP;
+ input QPLLCLK;
+ input QPLLREFCLK;
+ input RESETOVRD;
+ input RX8B10BEN;
+ input RXBUFRESET;
+ input RXCDRFREQRESET;
+ input RXCDRHOLD;
+ input RXCDROVRDEN;
+ input RXCDRRESET;
+ input RXCDRRESETRSV;
+ input RXCHBONDEN;
+ input RXCHBONDMASTER;
+ input RXCHBONDSLAVE;
+ input RXCOMMADETEN;
+ input RXDDIEN;
+ input RXDFEAGCHOLD;
+ input RXDFEAGCOVRDEN;
+ input RXDFECM1EN;
+ input RXDFELFHOLD;
+ input RXDFELFOVRDEN;
+ input RXDFELPMRESET;
+ input RXDFETAP2HOLD;
+ input RXDFETAP2OVRDEN;
+ input RXDFETAP3HOLD;
+ input RXDFETAP3OVRDEN;
+ input RXDFETAP4HOLD;
+ input RXDFETAP4OVRDEN;
+ input RXDFETAP5HOLD;
+ input RXDFETAP5OVRDEN;
+ input RXDFEUTHOLD;
+ input RXDFEUTOVRDEN;
+ input RXDFEVPHOLD;
+ input RXDFEVPOVRDEN;
+ input RXDFEVSEN;
+ input RXDFEXYDEN;
+ input RXDFEXYDHOLD;
+ input RXDFEXYDOVRDEN;
+ input RXDLYBYPASS;
+ input RXDLYEN;
+ input RXDLYOVRDEN;
+ input RXDLYSRESET;
+ input RXGEARBOXSLIP;
+ input RXLPMEN;
+ input RXLPMHFHOLD;
+ input RXLPMHFOVRDEN;
+ input RXLPMLFHOLD;
+ input RXLPMLFKLOVRDEN;
+ input RXMCOMMAALIGNEN;
+ input RXOOBRESET;
+ input RXOSHOLD;
+ input RXOSOVRDEN;
+ input RXPCOMMAALIGNEN;
+ input RXPCSRESET;
+ input RXPHALIGN;
+ input RXPHALIGNEN;
+ input RXPHDLYPD;
+ input RXPHDLYRESET;
+ input RXPHOVRDEN;
+ input RXPMARESET;
+ input RXPOLARITY;
+ input RXPRBSCNTRESET;
+ input RXQPIEN;
+ input RXSLIDE;
+ input RXUSERRDY;
+ input RXUSRCLK2;
+ input RXUSRCLK;
+ input SETERRSTATUS;
+ input TX8B10BEN;
+ input TXCOMINIT;
+ input TXCOMSAS;
+ input TXCOMWAKE;
+ input TXDEEMPH;
+ input TXDETECTRX;
+ input TXDIFFPD;
+ input TXDLYBYPASS;
+ input TXDLYEN;
+ input TXDLYHOLD;
+ input TXDLYOVRDEN;
+ input TXDLYSRESET;
+ input TXDLYUPDOWN;
+ input TXELECIDLE;
+ input TXINHIBIT;
+ input TXPCSRESET;
+ input TXPDELECIDLEMODE;
+ input TXPHALIGN;
+ input TXPHALIGNEN;
+ input TXPHDLYPD;
+ input TXPHDLYRESET;
+ input TXPHDLYTSTCLK;
+ input TXPHINIT;
+ input TXPHOVRDEN;
+ input TXPISOPD;
+ input TXPMARESET;
+ input TXPOLARITY;
+ input TXPOSTCURSORINV;
+ input TXPRBSFORCEERR;
+ input TXPRECURSORINV;
+ input TXQPIBIASEN;
+ input TXQPISTRONGPDOWN;
+ input TXQPIWEAKPUP;
+ input TXSTARTSEQ;
+ input TXSWING;
+ input TXUSERRDY;
+ input TXUSRCLK2;
+ input TXUSRCLK;
+ input [15:0] DRPDI;
+ input [15:0] GTRSVD;
+ input [15:0] PCSRSVDIN;
+ input [19:0] TSTIN;
+ input [1:0] RXELECIDLEMODE;
+ input [1:0] RXMONITORSEL;
+ input [1:0] RXPD;
+ input [1:0] RXSYSCLKSEL;
+ input [1:0] TXPD;
+ input [1:0] TXSYSCLKSEL;
+ input [2:0] CPLLREFCLKSEL;
+ input [2:0] LOOPBACK;
+ input [2:0] RXCHBONDLEVEL;
+ input [2:0] RXOUTCLKSEL;
+ input [2:0] RXPRBSSEL;
+ input [2:0] RXRATE;
+ input [2:0] TXBUFDIFFCTRL;
+ input [2:0] TXHEADER;
+ input [2:0] TXMARGIN;
+ input [2:0] TXOUTCLKSEL;
+ input [2:0] TXPRBSSEL;
+ input [2:0] TXRATE;
+ input [3:0] CLKRSVD;
+ input [3:0] TXDIFFCTRL;
+ input [4:0] PCSRSVDIN2;
+ input [4:0] PMARSVDIN2;
+ input [4:0] PMARSVDIN;
+ input [4:0] RXCHBONDI;
+ input [4:0] TXPOSTCURSOR;
+ input [4:0] TXPRECURSOR;
+ input [63:0] TXDATA;
+ input [6:0] TXMAINCURSOR;
+ input [6:0] TXSEQUENCE;
+ input [7:0] TX8B10BBYPASS;
+ input [7:0] TXCHARDISPMODE;
+ input [7:0] TXCHARDISPVAL;
+ input [7:0] TXCHARISK;
+ input [8:0] DRPADDR;
+endmodule
+
+module GTXE2_COMMON (...);
+ parameter [63:0] BIAS_CFG = 64'h0000040000001000;
+ parameter [31:0] COMMON_CFG = 32'h00000000;
+ parameter [0:0] IS_DRPCLK_INVERTED = 1'b0;
+ parameter [0:0] IS_GTGREFCLK_INVERTED = 1'b0;
+ parameter [0:0] IS_QPLLLOCKDETCLK_INVERTED = 1'b0;
+ parameter [26:0] QPLL_CFG = 27'h0680181;
+ parameter [3:0] QPLL_CLKOUT_CFG = 4'b0000;
+ parameter [5:0] QPLL_COARSE_FREQ_OVRD = 6'b010000;
+ parameter [0:0] QPLL_COARSE_FREQ_OVRD_EN = 1'b0;
+ parameter [9:0] QPLL_CP = 10'b0000011111;
+ parameter [0:0] QPLL_CP_MONITOR_EN = 1'b0;
+ parameter [0:0] QPLL_DMONITOR_SEL = 1'b0;
+ parameter [9:0] QPLL_FBDIV = 10'b0000000000;
+ parameter [0:0] QPLL_FBDIV_MONITOR_EN = 1'b0;
+ parameter [0:0] QPLL_FBDIV_RATIO = 1'b0;
+ parameter [23:0] QPLL_INIT_CFG = 24'h000006;
+ parameter [15:0] QPLL_LOCK_CFG = 16'h21E8;
+ parameter [3:0] QPLL_LPF = 4'b1111;
+ parameter integer QPLL_REFCLK_DIV = 2;
+ parameter [2:0] SIM_QPLLREFCLK_SEL = 3'b001;
+ parameter SIM_RESET_SPEEDUP = "TRUE";
+ parameter SIM_VERSION = "4.0";
+ output DRPRDY;
+ output QPLLFBCLKLOST;
+ output QPLLLOCK;
+ output QPLLOUTCLK;
+ output QPLLOUTREFCLK;
+ output QPLLREFCLKLOST;
+ output REFCLKOUTMONITOR;
+ output [15:0] DRPDO;
+ output [7:0] QPLLDMONITOR;
+ input BGBYPASSB;
+ input BGMONITORENB;
+ input BGPDB;
+ input DRPCLK;
+ input DRPEN;
+ input DRPWE;
+ input GTGREFCLK;
+ input GTNORTHREFCLK0;
+ input GTNORTHREFCLK1;
+ input GTREFCLK0;
+ input GTREFCLK1;
+ input GTSOUTHREFCLK0;
+ input GTSOUTHREFCLK1;
+ input QPLLLOCKDETCLK;
+ input QPLLLOCKEN;
+ input QPLLOUTRESET;
+ input QPLLPD;
+ input QPLLRESET;
+ input RCALENB;
+ input [15:0] DRPDI;
+ input [15:0] QPLLRSVD1;
+ input [2:0] QPLLREFCLKSEL;
+ input [4:0] BGRCALOVRD;
+ input [4:0] QPLLRSVD2;
+ input [7:0] DRPADDR;
+ input [7:0] PMARSVD;
+endmodule
+
+module IBUF_IBUFDISABLE (...);
+ parameter IBUF_LOW_PWR = "TRUE";
+ parameter IOSTANDARD = "DEFAULT";
+ parameter SIM_DEVICE = "7SERIES";
+ parameter USE_IBUFDISABLE = "TRUE";
+ output O;
+ input I;
+ input IBUFDISABLE;
+endmodule
+
+module IBUF_INTERMDISABLE (...);
+ parameter IBUF_LOW_PWR = "TRUE";
+ parameter IOSTANDARD = "DEFAULT";
+ parameter SIM_DEVICE = "7SERIES";
+ parameter USE_IBUFDISABLE = "TRUE";
+ output O;
+ input I;
+ input IBUFDISABLE;
+ input INTERMDISABLE;
+endmodule
+
+module IBUFDS (...);
+ parameter CAPACITANCE = "DONT_CARE";
+ parameter DIFF_TERM = "FALSE";
+ parameter DQS_BIAS = "FALSE";
+ parameter IBUF_DELAY_VALUE = "0";
+ parameter IBUF_LOW_PWR = "TRUE";
+ parameter IFD_DELAY_VALUE = "AUTO";
+ parameter IOSTANDARD = "DEFAULT";
+ output O;
+ input I, IB;
+endmodule
+
+module IBUFDS_DIFF_OUT (...);
+ parameter DIFF_TERM = "FALSE";
+ parameter DQS_BIAS = "FALSE";
+ parameter IBUF_LOW_PWR = "TRUE";
+ parameter IOSTANDARD = "DEFAULT";
+ output O, OB;
+ input I, IB;
+endmodule
+
+module IBUFDS_DIFF_OUT_IBUFDISABLE (...);
+ parameter DIFF_TERM = "FALSE";
+ parameter DQS_BIAS = "FALSE";
+ parameter IBUF_LOW_PWR = "TRUE";
+ parameter IOSTANDARD = "DEFAULT";
+ parameter SIM_DEVICE = "7SERIES";
+ parameter USE_IBUFDISABLE = "TRUE";
+ output O;
+ output OB;
+ input I;
+ input IB;
+ input IBUFDISABLE;
+endmodule
+
+module IBUFDS_DIFF_OUT_INTERMDISABLE (...);
+ parameter DIFF_TERM = "FALSE";
+ parameter DQS_BIAS = "FALSE";
+ parameter IBUF_LOW_PWR = "TRUE";
+ parameter IOSTANDARD = "DEFAULT";
+ parameter SIM_DEVICE = "7SERIES";
+ parameter USE_IBUFDISABLE = "TRUE";
+ output O;
+ output OB;
+ input I;
+ input IB;
+ input IBUFDISABLE;
+ input INTERMDISABLE;
+endmodule
+
+module IBUFDS_GTE2 (...);
+ parameter CLKCM_CFG = "TRUE";
+ parameter CLKRCV_TRST = "TRUE";
+ parameter CLKSWING_CFG = "TRUE";
+ output O;
+ output ODIV2;
+ input CEB;
+ input I;
+ input IB;
+endmodule
+
+module IBUFDS_IBUFDISABLE (...);
+ parameter DIFF_TERM = "FALSE";
+ parameter DQS_BIAS = "FALSE";
+ parameter IBUF_LOW_PWR = "TRUE";
+ parameter IOSTANDARD = "DEFAULT";
+ parameter SIM_DEVICE = "7SERIES";
+ parameter USE_IBUFDISABLE = "TRUE";
+ output O;
+ input I;
+ input IB;
+ input IBUFDISABLE;
+endmodule
+
+module IBUFDS_INTERMDISABLE (...);
+ parameter DIFF_TERM = "FALSE";
+ parameter DQS_BIAS = "FALSE";
+ parameter IBUF_LOW_PWR = "TRUE";
+ parameter IOSTANDARD = "DEFAULT";
+ parameter SIM_DEVICE = "7SERIES";
+ parameter USE_IBUFDISABLE = "TRUE";
+ output O;
+ input I;
+ input IB;
+ input IBUFDISABLE;
+ input INTERMDISABLE;
+endmodule
+
+module ICAPE2 (...);
+ parameter [31:0] DEVICE_ID = 32'h04244093;
+ parameter ICAP_WIDTH = "X32";
+ parameter SIM_CFG_FILE_NAME = "NONE";
+ output [31:0] O;
+ input CLK;
+ input CSIB;
+ input RDWRB;
+ input [31:0] I;
+endmodule
+
+module IDDR (...);
+ parameter DDR_CLK_EDGE = "OPPOSITE_EDGE";
+ parameter INIT_Q1 = 1'b0;
+ parameter INIT_Q2 = 1'b0;
+ parameter [0:0] IS_C_INVERTED = 1'b0;
+ parameter [0:0] IS_D_INVERTED = 1'b0;
+ parameter SRTYPE = "SYNC";
+ parameter MSGON = "TRUE";
+ parameter XON = "TRUE";
+ output Q1;
+ output Q2;
+ input C;
+ input CE;
+ input D;
+ input R;
+ input S;
+endmodule
+
+module IDDR_2CLK (...);
+ parameter DDR_CLK_EDGE = "OPPOSITE_EDGE";
+ parameter INIT_Q1 = 1'b0;
+ parameter INIT_Q2 = 1'b0;
+ parameter [0:0] IS_CB_INVERTED = 1'b0;
+ parameter [0:0] IS_C_INVERTED = 1'b0;
+ parameter [0:0] IS_D_INVERTED = 1'b0;
+ parameter SRTYPE = "SYNC";
+ output Q1;
+ output Q2;
+ input C;
+ input CB;
+ input CE;
+ input D;
+ input R;
+ input S;
+endmodule
+
+module IDELAYCTRL (...);
+ parameter SIM_DEVICE = "7SERIES";
+ output RDY;
+ input REFCLK;
+ input RST;
+endmodule
+
+module IDELAYE2 (...);
+ parameter CINVCTRL_SEL = "FALSE";
+ parameter DELAY_SRC = "IDATAIN";
+ parameter HIGH_PERFORMANCE_MODE = "FALSE";
+ parameter IDELAY_TYPE = "FIXED";
+ parameter integer IDELAY_VALUE = 0;
+ parameter [0:0] IS_C_INVERTED = 1'b0;
+ parameter [0:0] IS_DATAIN_INVERTED = 1'b0;
+ parameter [0:0] IS_IDATAIN_INVERTED = 1'b0;
+ parameter PIPE_SEL = "FALSE";
+ parameter real REFCLK_FREQUENCY = 200.0;
+ parameter SIGNAL_PATTERN = "DATA";
+ parameter integer SIM_DELAY_D = 0;
+ output [4:0] CNTVALUEOUT;
+ output DATAOUT;
+ input C;
+ input CE;
+ input CINVCTRL;
+ input [4:0] CNTVALUEIN;
+ input DATAIN;
+ input IDATAIN;
+ input INC;
+ input LD;
+ input LDPIPEEN;
+ input REGRST;
+endmodule
+
+module IN_FIFO (...);
+ parameter integer ALMOST_EMPTY_VALUE = 1;
+ parameter integer ALMOST_FULL_VALUE = 1;
+ parameter ARRAY_MODE = "ARRAY_MODE_4_X_8";
+ parameter SYNCHRONOUS_MODE = "FALSE";
+ output ALMOSTEMPTY;
+ output ALMOSTFULL;
+ output EMPTY;
+ output FULL;
+ output [7:0] Q0;
+ output [7:0] Q1;
+ output [7:0] Q2;
+ output [7:0] Q3;
+ output [7:0] Q4;
+ output [7:0] Q5;
+ output [7:0] Q6;
+ output [7:0] Q7;
+ output [7:0] Q8;
+ output [7:0] Q9;
+ input RDCLK;
+ input RDEN;
+ input RESET;
+ input WRCLK;
+ input WREN;
+ input [3:0] D0;
+ input [3:0] D1;
+ input [3:0] D2;
+ input [3:0] D3;
+ input [3:0] D4;
+ input [3:0] D7;
+ input [3:0] D8;
+ input [3:0] D9;
+ input [7:0] D5;
+ input [7:0] D6;
+endmodule
+
+module IOBUF (...);
+ parameter integer DRIVE = 12;
+ parameter IBUF_LOW_PWR = "TRUE";
+ parameter IOSTANDARD = "DEFAULT";
+ parameter SLEW = "SLOW";
+ output O;
+ input I, T;
+endmodule
+
+module IOBUF_DCIEN (...);
+ parameter integer DRIVE = 12;
+ parameter IBUF_LOW_PWR = "TRUE";
+ parameter IOSTANDARD = "DEFAULT";
+ parameter SIM_DEVICE = "7SERIES";
+ parameter SLEW = "SLOW";
+ parameter USE_IBUFDISABLE = "TRUE";
+ output O;
+ input DCITERMDISABLE;
+ input I;
+ input IBUFDISABLE;
+ input T;
+endmodule
+
+module IOBUF_INTERMDISABLE (...);
+ parameter integer DRIVE = 12;
+ parameter IBUF_LOW_PWR = "TRUE";
+ parameter IOSTANDARD = "DEFAULT";
+ parameter SIM_DEVICE = "7SERIES";
+ parameter SLEW = "SLOW";
+ parameter USE_IBUFDISABLE = "TRUE";
+ output O;
+ input I;
+ input IBUFDISABLE;
+ input INTERMDISABLE;
+ input T;
+endmodule
+
+module IOBUFDS (...);
+ parameter DIFF_TERM = "FALSE";
+ parameter DQS_BIAS = "FALSE";
+ parameter IBUF_LOW_PWR = "TRUE";
+ parameter IOSTANDARD = "DEFAULT";
+ parameter SLEW = "SLOW";
+ output O;
+ input I, T;
+endmodule
+
+module IOBUFDS_DCIEN (...);
+ parameter DIFF_TERM = "FALSE";
+ parameter DQS_BIAS = "FALSE";
+ parameter IBUF_LOW_PWR = "TRUE";
+ parameter IOSTANDARD = "DEFAULT";
+ parameter SIM_DEVICE = "7SERIES";
+ parameter SLEW = "SLOW";
+ parameter USE_IBUFDISABLE = "TRUE";
+ output O;
+ input DCITERMDISABLE;
+ input I;
+ input IBUFDISABLE;
+ input T;
+endmodule
+
+module IOBUFDS_DIFF_OUT (...);
+ parameter DIFF_TERM = "FALSE";
+ parameter DQS_BIAS = "FALSE";
+ parameter IBUF_LOW_PWR = "TRUE";
+ parameter IOSTANDARD = "DEFAULT";
+ output O;
+ output OB;
+ input I;
+ input TM;
+ input TS;
+endmodule
+
+module IOBUFDS_DIFF_OUT_DCIEN (...);
+ parameter DIFF_TERM = "FALSE";
+ parameter DQS_BIAS = "FALSE";
+ parameter IBUF_LOW_PWR = "TRUE";
+ parameter IOSTANDARD = "DEFAULT";
+ parameter SIM_DEVICE = "7SERIES";
+ parameter USE_IBUFDISABLE = "TRUE";
+ output O;
+ output OB;
+ input DCITERMDISABLE;
+ input I;
+ input IBUFDISABLE;
+ input TM;
+ input TS;
+endmodule
+
+module IOBUFDS_DIFF_OUT_INTERMDISABLE (...);
+ parameter DIFF_TERM = "FALSE";
+ parameter DQS_BIAS = "FALSE";
+ parameter IBUF_LOW_PWR = "TRUE";
+ parameter IOSTANDARD = "DEFAULT";
+ parameter SIM_DEVICE = "7SERIES";
+ parameter USE_IBUFDISABLE = "TRUE";
+ output O;
+ output OB;
+ input I;
+ input IBUFDISABLE;
+ input INTERMDISABLE;
+ input TM;
+ input TS;
+endmodule
+
+module ISERDESE2 (...);
+ parameter DATA_RATE = "DDR";
+ parameter integer DATA_WIDTH = 4;
+ parameter DYN_CLKDIV_INV_EN = "FALSE";
+ parameter DYN_CLK_INV_EN = "FALSE";
+ parameter [0:0] INIT_Q1 = 1'b0;
+ parameter [0:0] INIT_Q2 = 1'b0;
+ parameter [0:0] INIT_Q3 = 1'b0;
+ parameter [0:0] INIT_Q4 = 1'b0;
+ parameter INTERFACE_TYPE = "MEMORY";
+ parameter IOBDELAY = "NONE";
+ parameter [0:0] IS_CLKB_INVERTED = 1'b0;
+ parameter [0:0] IS_CLKDIVP_INVERTED = 1'b0;
+ parameter [0:0] IS_CLKDIV_INVERTED = 1'b0;
+ parameter [0:0] IS_CLK_INVERTED = 1'b0;
+ parameter [0:0] IS_D_INVERTED = 1'b0;
+ parameter [0:0] IS_OCLKB_INVERTED = 1'b0;
+ parameter [0:0] IS_OCLK_INVERTED = 1'b0;
+ parameter integer NUM_CE = 2;
+ parameter OFB_USED = "FALSE";
+ parameter SERDES_MODE = "MASTER";
+ parameter [0:0] SRVAL_Q1 = 1'b0;
+ parameter [0:0] SRVAL_Q2 = 1'b0;
+ parameter [0:0] SRVAL_Q3 = 1'b0;
+ parameter [0:0] SRVAL_Q4 = 1'b0;
+ output O;
+ output Q1;
+ output Q2;
+ output Q3;
+ output Q4;
+ output Q5;
+ output Q6;
+ output Q7;
+ output Q8;
+ output SHIFTOUT1;
+ output SHIFTOUT2;
+ input BITSLIP;
+ input CE1;
+ input CE2;
+ input CLK;
+ input CLKB;
+ input CLKDIV;
+ input CLKDIVP;
+ input D;
+ input DDLY;
+ input DYNCLKDIVSEL;
+ input DYNCLKSEL;
+ input OCLK;
+ input OCLKB;
+ input OFB;
+ input RST;
+ input SHIFTIN1;
+ input SHIFTIN2;
+endmodule
+
+module KEEPER (...);
+endmodule
+
+module LDCE (...);
+ parameter [0:0] INIT = 1'b0;
+ parameter [0:0] IS_CLR_INVERTED = 1'b0;
+ parameter [0:0] IS_G_INVERTED = 1'b0;
+ parameter MSGON = "TRUE";
+ parameter XON = "TRUE";
+ output Q;
+ input CLR, D, G, GE;
+endmodule
+
+module LDPE (...);
+ parameter [0:0] INIT = 1'b1;
+ parameter [0:0] IS_G_INVERTED = 1'b0;
+ parameter [0:0] IS_PRE_INVERTED = 1'b0;
+ parameter MSGON = "TRUE";
+ parameter XON = "TRUE";
+ output Q;
+ input D, G, GE, PRE;
+endmodule
+
+module LUT6_2 (...);
+ parameter [63:0] INIT = 64'h0000000000000000;
+ input I0, I1, I2, I3, I4, I5;
+ output O5, O6;
+endmodule
+
+module MMCME2_ADV (...);
+ parameter BANDWIDTH = "OPTIMIZED";
+ parameter real CLKFBOUT_MULT_F = 5.000;
+ parameter real CLKFBOUT_PHASE = 0.000;
+ parameter CLKFBOUT_USE_FINE_PS = "FALSE";
+ parameter real CLKIN1_PERIOD = 0.000;
+ parameter real CLKIN2_PERIOD = 0.000;
+ parameter real CLKIN_FREQ_MAX = 1066.000;
+ parameter real CLKIN_FREQ_MIN = 10.000;
+ parameter real CLKOUT0_DIVIDE_F = 1.000;
+ parameter real CLKOUT0_DUTY_CYCLE = 0.500;
+ parameter real CLKOUT0_PHASE = 0.000;
+ parameter CLKOUT0_USE_FINE_PS = "FALSE";
+ parameter integer CLKOUT1_DIVIDE = 1;
+ parameter real CLKOUT1_DUTY_CYCLE = 0.500;
+ parameter real CLKOUT1_PHASE = 0.000;
+ parameter CLKOUT1_USE_FINE_PS = "FALSE";
+ parameter integer CLKOUT2_DIVIDE = 1;
+ parameter real CLKOUT2_DUTY_CYCLE = 0.500;
+ parameter real CLKOUT2_PHASE = 0.000;
+ parameter CLKOUT2_USE_FINE_PS = "FALSE";
+ parameter integer CLKOUT3_DIVIDE = 1;
+ parameter real CLKOUT3_DUTY_CYCLE = 0.500;
+ parameter real CLKOUT3_PHASE = 0.000;
+ parameter CLKOUT3_USE_FINE_PS = "FALSE";
+ parameter CLKOUT4_CASCADE = "FALSE";
+ parameter integer CLKOUT4_DIVIDE = 1;
+ parameter real CLKOUT4_DUTY_CYCLE = 0.500;
+ parameter real CLKOUT4_PHASE = 0.000;
+ parameter CLKOUT4_USE_FINE_PS = "FALSE";
+ parameter integer CLKOUT5_DIVIDE = 1;
+ parameter real CLKOUT5_DUTY_CYCLE = 0.500;
+ parameter real CLKOUT5_PHASE = 0.000;
+ parameter CLKOUT5_USE_FINE_PS = "FALSE";
+ parameter integer CLKOUT6_DIVIDE = 1;
+ parameter real CLKOUT6_DUTY_CYCLE = 0.500;
+ parameter real CLKOUT6_PHASE = 0.000;
+ parameter CLKOUT6_USE_FINE_PS = "FALSE";
+ parameter real CLKPFD_FREQ_MAX = 550.000;
+ parameter real CLKPFD_FREQ_MIN = 10.000;
+ parameter COMPENSATION = "ZHOLD";
+ parameter integer DIVCLK_DIVIDE = 1;
+ parameter [0:0] IS_CLKINSEL_INVERTED = 1'b0;
+ parameter [0:0] IS_PSEN_INVERTED = 1'b0;
+ parameter [0:0] IS_PSINCDEC_INVERTED = 1'b0;
+ parameter [0:0] IS_PWRDWN_INVERTED = 1'b0;
+ parameter [0:0] IS_RST_INVERTED = 1'b0;
+ parameter real REF_JITTER1 = 0.010;
+ parameter real REF_JITTER2 = 0.010;
+ parameter SS_EN = "FALSE";
+ parameter SS_MODE = "CENTER_HIGH";
+ parameter integer SS_MOD_PERIOD = 10000;
+ parameter STARTUP_WAIT = "FALSE";
+ parameter real VCOCLK_FREQ_MAX = 1600.000;
+ parameter real VCOCLK_FREQ_MIN = 600.000;
+ parameter STARTUP_WAIT = "FALSE";
+ output CLKFBOUT;
+ output CLKFBOUTB;
+ output CLKFBSTOPPED;
+ output CLKINSTOPPED;
+ output CLKOUT0;
+ output CLKOUT0B;
+ output CLKOUT1;
+ output CLKOUT1B;
+ output CLKOUT2;
+ output CLKOUT2B;
+ output CLKOUT3;
+ output CLKOUT3B;
+ output CLKOUT4;
+ output CLKOUT5;
+ output CLKOUT6;
+ output [15:0] DO;
+ output DRDY;
+ output LOCKED;
+ output PSDONE;
+ input CLKFBIN;
+ input CLKIN1;
+ input CLKIN2;
+ input CLKINSEL;
+ input [6:0] DADDR;
+ input DCLK;
+ input DEN;
+ input [15:0] DI;
+ input DWE;
+ input PSCLK;
+ input PSEN;
+ input PSINCDEC;
+ input PWRDWN;
+ input RST;
+endmodule
+
+module MMCME2_BASE (...);
+ parameter BANDWIDTH = "OPTIMIZED";
+ parameter real CLKFBOUT_MULT_F = 5.000;
+ parameter real CLKFBOUT_PHASE = 0.000;
+ parameter real CLKIN1_PERIOD = 0.000;
+ parameter real CLKOUT0_DIVIDE_F = 1.000;
+ parameter real CLKOUT0_DUTY_CYCLE = 0.500;
+ parameter real CLKOUT0_PHASE = 0.000;
+ parameter integer CLKOUT1_DIVIDE = 1;
+ parameter real CLKOUT1_DUTY_CYCLE = 0.500;
+ parameter real CLKOUT1_PHASE = 0.000;
+ parameter integer CLKOUT2_DIVIDE = 1;
+ parameter real CLKOUT2_DUTY_CYCLE = 0.500;
+ parameter real CLKOUT2_PHASE = 0.000;
+ parameter integer CLKOUT3_DIVIDE = 1;
+ parameter real CLKOUT3_DUTY_CYCLE = 0.500;
+ parameter real CLKOUT3_PHASE = 0.000;
+ parameter CLKOUT4_CASCADE = "FALSE";
+ parameter integer CLKOUT4_DIVIDE = 1;
+ parameter real CLKOUT4_DUTY_CYCLE = 0.500;
+ parameter real CLKOUT4_PHASE = 0.000;
+ parameter integer CLKOUT5_DIVIDE = 1;
+ parameter real CLKOUT5_DUTY_CYCLE = 0.500;
+ parameter real CLKOUT5_PHASE = 0.000;
+ parameter integer CLKOUT6_DIVIDE = 1;
+ parameter real CLKOUT6_DUTY_CYCLE = 0.500;
+ parameter real CLKOUT6_PHASE = 0.000;
+ parameter integer DIVCLK_DIVIDE = 1;
+ parameter real REF_JITTER1 = 0.010;
+ parameter STARTUP_WAIT = "FALSE";
+ output CLKFBOUT;
+ output CLKFBOUTB;
+ output CLKOUT0;
+ output CLKOUT0B;
+ output CLKOUT1;
+ output CLKOUT1B;
+ output CLKOUT2;
+ output CLKOUT2B;
+ output CLKOUT3;
+ output CLKOUT3B;
+ output CLKOUT4;
+ output CLKOUT5;
+ output CLKOUT6;
+ output LOCKED;
+ input CLKFBIN;
+ input CLKIN1;
+ input PWRDWN;
+ input RST;
+endmodule
+
+module OBUFDS (...);
+ parameter CAPACITANCE = "DONT_CARE";
+ parameter IOSTANDARD = "DEFAULT";
+ parameter SLEW = "SLOW";
+ output O, OB;
+ input I;
+endmodule
+
+module OBUFT (...);
+ parameter CAPACITANCE = "DONT_CARE";
+ parameter integer DRIVE = 12;
+ parameter IOSTANDARD = "DEFAULT";
+ parameter SLEW = "SLOW";
+ output O;
+ input I, T;
+endmodule
+
+module OBUFTDS (...);
+ parameter CAPACITANCE = "DONT_CARE";
+ parameter IOSTANDARD = "DEFAULT";
+ parameter SLEW = "SLOW";
+ output O, OB;
+ input I, T;
+endmodule
+
+module ODDR (...);
+ output Q;
+ input C;
+ input CE;
+ input D1;
+ input D2;
+ input R;
+ input S;
+ parameter DDR_CLK_EDGE = "OPPOSITE_EDGE";
+ parameter INIT = 1'b0;
+ parameter [0:0] IS_C_INVERTED = 1'b0;
+ parameter [0:0] IS_D1_INVERTED = 1'b0;
+ parameter [0:0] IS_D2_INVERTED = 1'b0;
+ parameter SRTYPE = "SYNC";
+ parameter MSGON = "TRUE";
+ parameter XON = "TRUE";
+endmodule
+
+module ODELAYE2 (...);
+ parameter CINVCTRL_SEL = "FALSE";
+ parameter DELAY_SRC = "ODATAIN";
+ parameter HIGH_PERFORMANCE_MODE = "FALSE";
+ parameter [0:0] IS_C_INVERTED = 1'b0;
+ parameter [0:0] IS_ODATAIN_INVERTED = 1'b0;
+ parameter ODELAY_TYPE = "FIXED";
+ parameter integer ODELAY_VALUE = 0;
+ parameter PIPE_SEL = "FALSE";
+ parameter real REFCLK_FREQUENCY = 200.0;
+ parameter SIGNAL_PATTERN = "DATA";
+ parameter integer SIM_DELAY_D = 0;
+ output [4:0] CNTVALUEOUT;
+ output DATAOUT;
+ input C;
+ input CE;
+ input CINVCTRL;
+ input CLKIN;
+ input [4:0] CNTVALUEIN;
+ input INC;
+ input LD;
+ input LDPIPEEN;
+ input ODATAIN;
+ input REGRST;
+endmodule
+
+module OSERDESE2 (...);
+ parameter DATA_RATE_OQ = "DDR";
+ parameter DATA_RATE_TQ = "DDR";
+ parameter integer DATA_WIDTH = 4;
+ parameter [0:0] INIT_OQ = 1'b0;
+ parameter [0:0] INIT_TQ = 1'b0;
+ parameter [0:0] IS_CLKDIV_INVERTED = 1'b0;
+ parameter [0:0] IS_CLK_INVERTED = 1'b0;
+ parameter [0:0] IS_D1_INVERTED = 1'b0;
+ parameter [0:0] IS_D2_INVERTED = 1'b0;
+ parameter [0:0] IS_D3_INVERTED = 1'b0;
+ parameter [0:0] IS_D4_INVERTED = 1'b0;
+ parameter [0:0] IS_D5_INVERTED = 1'b0;
+ parameter [0:0] IS_D6_INVERTED = 1'b0;
+ parameter [0:0] IS_D7_INVERTED = 1'b0;
+ parameter [0:0] IS_D8_INVERTED = 1'b0;
+ parameter [0:0] IS_T1_INVERTED = 1'b0;
+ parameter [0:0] IS_T2_INVERTED = 1'b0;
+ parameter [0:0] IS_T3_INVERTED = 1'b0;
+ parameter [0:0] IS_T4_INVERTED = 1'b0;
+ parameter SERDES_MODE = "MASTER";
+ parameter [0:0] SRVAL_OQ = 1'b0;
+ parameter [0:0] SRVAL_TQ = 1'b0;
+ parameter TBYTE_CTL = "FALSE";
+ parameter TBYTE_SRC = "FALSE";
+ parameter integer TRISTATE_WIDTH = 4;
+ output OFB;
+ output OQ;
+ output SHIFTOUT1;
+ output SHIFTOUT2;
+ output TBYTEOUT;
+ output TFB;
+ output TQ;
+ input CLK;
+ input CLKDIV;
+ input D1;
+ input D2;
+ input D3;
+ input D4;
+ input D5;
+ input D6;
+ input D7;
+ input D8;
+ input OCE;
+ input RST;
+ input SHIFTIN1;
+ input SHIFTIN2;
+ input T1;
+ input T2;
+ input T3;
+ input T4;
+ input TBYTEIN;
+ input TCE;
+endmodule
+
+module OUT_FIFO (...);
+ parameter integer ALMOST_EMPTY_VALUE = 1;
+ parameter integer ALMOST_FULL_VALUE = 1;
+ parameter ARRAY_MODE = "ARRAY_MODE_8_X_4";
+ parameter OUTPUT_DISABLE = "FALSE";
+ parameter SYNCHRONOUS_MODE = "FALSE";
+ output ALMOSTEMPTY;
+ output ALMOSTFULL;
+ output EMPTY;
+ output FULL;
+ output [3:0] Q0;
+ output [3:0] Q1;
+ output [3:0] Q2;
+ output [3:0] Q3;
+ output [3:0] Q4;
+ output [3:0] Q7;
+ output [3:0] Q8;
+ output [3:0] Q9;
+ output [7:0] Q5;
+ output [7:0] Q6;
+ input RDCLK;
+ input RDEN;
+ input RESET;
+ input WRCLK;
+ input WREN;
+ input [7:0] D0;
+ input [7:0] D1;
+ input [7:0] D2;
+ input [7:0] D3;
+ input [7:0] D4;
+ input [7:0] D5;
+ input [7:0] D6;
+ input [7:0] D7;
+ input [7:0] D8;
+ input [7:0] D9;
+endmodule
+
+module PHASER_IN (...);
+ parameter integer CLKOUT_DIV = 4;
+ parameter DQS_BIAS_MODE = "FALSE";
+ parameter EN_ISERDES_RST = "FALSE";
+ parameter integer FINE_DELAY = 0;
+ parameter FREQ_REF_DIV = "NONE";
+ parameter [0:0] IS_RST_INVERTED = 1'b0;
+ parameter real MEMREFCLK_PERIOD = 0.000;
+ parameter OUTPUT_CLK_SRC = "PHASE_REF";
+ parameter real PHASEREFCLK_PERIOD = 0.000;
+ parameter real REFCLK_PERIOD = 0.000;
+ parameter integer SEL_CLK_OFFSET = 5;
+ parameter SYNC_IN_DIV_RST = "FALSE";
+ output FINEOVERFLOW;
+ output ICLK;
+ output ICLKDIV;
+ output ISERDESRST;
+ output RCLK;
+ output [5:0] COUNTERREADVAL;
+ input COUNTERLOADEN;
+ input COUNTERREADEN;
+ input DIVIDERST;
+ input EDGEADV;
+ input FINEENABLE;
+ input FINEINC;
+ input FREQREFCLK;
+ input MEMREFCLK;
+ input PHASEREFCLK;
+ input RST;
+ input SYNCIN;
+ input SYSCLK;
+ input [1:0] RANKSEL;
+ input [5:0] COUNTERLOADVAL;
+endmodule
+
+module PHASER_IN_PHY (...);
+ parameter BURST_MODE = "FALSE";
+ parameter integer CLKOUT_DIV = 4;
+ parameter [0:0] DQS_AUTO_RECAL = 1'b1;
+ parameter DQS_BIAS_MODE = "FALSE";
+ parameter [2:0] DQS_FIND_PATTERN = 3'b001;
+ parameter integer FINE_DELAY = 0;
+ parameter FREQ_REF_DIV = "NONE";
+ parameter [0:0] IS_RST_INVERTED = 1'b0;
+ parameter real MEMREFCLK_PERIOD = 0.000;
+ parameter OUTPUT_CLK_SRC = "PHASE_REF";
+ parameter real PHASEREFCLK_PERIOD = 0.000;
+ parameter real REFCLK_PERIOD = 0.000;
+ parameter integer SEL_CLK_OFFSET = 5;
+ parameter SYNC_IN_DIV_RST = "FALSE";
+ parameter WR_CYCLES = "FALSE";
+ output DQSFOUND;
+ output DQSOUTOFRANGE;
+ output FINEOVERFLOW;
+ output ICLK;
+ output ICLKDIV;
+ output ISERDESRST;
+ output PHASELOCKED;
+ output RCLK;
+ output WRENABLE;
+ output [5:0] COUNTERREADVAL;
+ input BURSTPENDINGPHY;
+ input COUNTERLOADEN;
+ input COUNTERREADEN;
+ input FINEENABLE;
+ input FINEINC;
+ input FREQREFCLK;
+ input MEMREFCLK;
+ input PHASEREFCLK;
+ input RST;
+ input RSTDQSFIND;
+ input SYNCIN;
+ input SYSCLK;
+ input [1:0] ENCALIBPHY;
+ input [1:0] RANKSELPHY;
+ input [5:0] COUNTERLOADVAL;
+endmodule
+
+module PHASER_OUT (...);
+ parameter integer CLKOUT_DIV = 4;
+ parameter COARSE_BYPASS = "FALSE";
+ parameter integer COARSE_DELAY = 0;
+ parameter EN_OSERDES_RST = "FALSE";
+ parameter integer FINE_DELAY = 0;
+ parameter [0:0] IS_RST_INVERTED = 1'b0;
+ parameter real MEMREFCLK_PERIOD = 0.000;
+ parameter OCLKDELAY_INV = "FALSE";
+ parameter integer OCLK_DELAY = 0;
+ parameter OUTPUT_CLK_SRC = "PHASE_REF";
+ parameter real PHASEREFCLK_PERIOD = 0.000;
+ parameter [2:0] PO = 3'b000;
+ parameter real REFCLK_PERIOD = 0.000;
+ parameter SYNC_IN_DIV_RST = "FALSE";
+ output COARSEOVERFLOW;
+ output FINEOVERFLOW;
+ output OCLK;
+ output OCLKDELAYED;
+ output OCLKDIV;
+ output OSERDESRST;
+ output [8:0] COUNTERREADVAL;
+ input COARSEENABLE;
+ input COARSEINC;
+ input COUNTERLOADEN;
+ input COUNTERREADEN;
+ input DIVIDERST;
+ input EDGEADV;
+ input FINEENABLE;
+ input FINEINC;
+ input FREQREFCLK;
+ input MEMREFCLK;
+ input PHASEREFCLK;
+ input RST;
+ input SELFINEOCLKDELAY;
+ input SYNCIN;
+ input SYSCLK;
+ input [8:0] COUNTERLOADVAL;
+endmodule
+
+module PHASER_OUT_PHY (...);
+ parameter integer CLKOUT_DIV = 4;
+ parameter COARSE_BYPASS = "FALSE";
+ parameter integer COARSE_DELAY = 0;
+ parameter DATA_CTL_N = "FALSE";
+ parameter DATA_RD_CYCLES = "FALSE";
+ parameter integer FINE_DELAY = 0;
+ parameter [0:0] IS_RST_INVERTED = 1'b0;
+ parameter real MEMREFCLK_PERIOD = 0.000;
+ parameter OCLKDELAY_INV = "FALSE";
+ parameter integer OCLK_DELAY = 0;
+ parameter OUTPUT_CLK_SRC = "PHASE_REF";
+ parameter real PHASEREFCLK_PERIOD = 0.000;
+ parameter [2:0] PO = 3'b000;
+ parameter real REFCLK_PERIOD = 0.000;
+ parameter SYNC_IN_DIV_RST = "FALSE";
+ output COARSEOVERFLOW;
+ output FINEOVERFLOW;
+ output OCLK;
+ output OCLKDELAYED;
+ output OCLKDIV;
+ output OSERDESRST;
+ output RDENABLE;
+ output [1:0] CTSBUS;
+ output [1:0] DQSBUS;
+ output [1:0] DTSBUS;
+ output [8:0] COUNTERREADVAL;
+ input BURSTPENDINGPHY;
+ input COARSEENABLE;
+ input COARSEINC;
+ input COUNTERLOADEN;
+ input COUNTERREADEN;
+ input FINEENABLE;
+ input FINEINC;
+ input FREQREFCLK;
+ input MEMREFCLK;
+ input PHASEREFCLK;
+ input RST;
+ input SELFINEOCLKDELAY;
+ input SYNCIN;
+ input SYSCLK;
+ input [1:0] ENCALIBPHY;
+ input [8:0] COUNTERLOADVAL;
+endmodule
+
+module PHASER_REF (...);
+ parameter [0:0] IS_RST_INVERTED = 1'b0;
+ parameter [0:0] IS_PWRDWN_INVERTED = 1'b0;
+ output LOCKED;
+ input CLKIN;
+ input PWRDWN;
+ input RST;
+endmodule
+
+module PHY_CONTROL (...);
+ parameter integer AO_TOGGLE = 0;
+ parameter [3:0] AO_WRLVL_EN = 4'b0000;
+ parameter BURST_MODE = "FALSE";
+ parameter integer CLK_RATIO = 1;
+ parameter integer CMD_OFFSET = 0;
+ parameter integer CO_DURATION = 0;
+ parameter DATA_CTL_A_N = "FALSE";
+ parameter DATA_CTL_B_N = "FALSE";
+ parameter DATA_CTL_C_N = "FALSE";
+ parameter DATA_CTL_D_N = "FALSE";
+ parameter DISABLE_SEQ_MATCH = "TRUE";
+ parameter integer DI_DURATION = 0;
+ parameter integer DO_DURATION = 0;
+ parameter integer EVENTS_DELAY = 63;
+ parameter integer FOUR_WINDOW_CLOCKS = 63;
+ parameter MULTI_REGION = "FALSE";
+ parameter PHY_COUNT_ENABLE = "FALSE";
+ parameter integer RD_CMD_OFFSET_0 = 0;
+ parameter integer RD_CMD_OFFSET_1 = 00;
+ parameter integer RD_CMD_OFFSET_2 = 0;
+ parameter integer RD_CMD_OFFSET_3 = 0;
+ parameter integer RD_DURATION_0 = 0;
+ parameter integer RD_DURATION_1 = 0;
+ parameter integer RD_DURATION_2 = 0;
+ parameter integer RD_DURATION_3 = 0;
+ parameter SYNC_MODE = "FALSE";
+ parameter integer WR_CMD_OFFSET_0 = 0;
+ parameter integer WR_CMD_OFFSET_1 = 0;
+ parameter integer WR_CMD_OFFSET_2 = 0;
+ parameter integer WR_CMD_OFFSET_3 = 0;
+ parameter integer WR_DURATION_0 = 0;
+ parameter integer WR_DURATION_1 = 0;
+ parameter integer WR_DURATION_2 = 0;
+ parameter integer WR_DURATION_3 = 0;
+ output PHYCTLALMOSTFULL;
+ output PHYCTLEMPTY;
+ output PHYCTLFULL;
+ output PHYCTLREADY;
+ output [1:0] INRANKA;
+ output [1:0] INRANKB;
+ output [1:0] INRANKC;
+ output [1:0] INRANKD;
+ output [1:0] PCENABLECALIB;
+ output [3:0] AUXOUTPUT;
+ output [3:0] INBURSTPENDING;
+ output [3:0] OUTBURSTPENDING;
+ input MEMREFCLK;
+ input PHYCLK;
+ input PHYCTLMSTREMPTY;
+ input PHYCTLWRENABLE;
+ input PLLLOCK;
+ input READCALIBENABLE;
+ input REFDLLLOCK;
+ input RESET;
+ input SYNCIN;
+ input WRITECALIBENABLE;
+ input [31:0] PHYCTLWD;
+endmodule
+
+module PLLE2_ADV (...);
+ parameter BANDWIDTH = "OPTIMIZED";
+ parameter COMPENSATION = "ZHOLD";
+ parameter STARTUP_WAIT = "FALSE";
+ parameter integer CLKOUT0_DIVIDE = 1;
+ parameter integer CLKOUT1_DIVIDE = 1;
+ parameter integer CLKOUT2_DIVIDE = 1;
+ parameter integer CLKOUT3_DIVIDE = 1;
+ parameter integer CLKOUT4_DIVIDE = 1;
+ parameter integer CLKOUT5_DIVIDE = 1;
+ parameter integer DIVCLK_DIVIDE = 1;
+ parameter integer CLKFBOUT_MULT = 5;
+ parameter real CLKFBOUT_PHASE = 0.000;
+ parameter real CLKIN1_PERIOD = 0.000;
+ parameter real CLKIN2_PERIOD = 0.000;
+ parameter real CLKOUT0_DUTY_CYCLE = 0.500;
+ parameter real CLKOUT0_PHASE = 0.000;
+ parameter real CLKOUT1_DUTY_CYCLE = 0.500;
+ parameter real CLKOUT1_PHASE = 0.000;
+ parameter real CLKOUT2_DUTY_CYCLE = 0.500;
+ parameter real CLKOUT2_PHASE = 0.000;
+ parameter real CLKOUT3_DUTY_CYCLE = 0.500;
+ parameter real CLKOUT3_PHASE = 0.000;
+ parameter real CLKOUT4_DUTY_CYCLE = 0.500;
+ parameter real CLKOUT4_PHASE = 0.000;
+ parameter real CLKOUT5_DUTY_CYCLE = 0.500;
+ parameter real CLKOUT5_PHASE = 0.000;
+ parameter [0:0] IS_CLKINSEL_INVERTED = 1'b0;
+ parameter [0:0] IS_PWRDWN_INVERTED = 1'b0;
+ parameter [0:0] IS_RST_INVERTED = 1'b0;
+ parameter real REF_JITTER1 = 0.010;
+ parameter real REF_JITTER2 = 0.010;
+ parameter real VCOCLK_FREQ_MAX = 2133.000;
+ parameter real VCOCLK_FREQ_MIN = 800.000;
+ parameter real CLKIN_FREQ_MAX = 1066.000;
+ parameter real CLKIN_FREQ_MIN = 19.000;
+ parameter real CLKPFD_FREQ_MAX = 550.0;
+ parameter real CLKPFD_FREQ_MIN = 19.0;
+ output CLKFBOUT;
+ output CLKOUT0;
+ output CLKOUT1;
+ output CLKOUT2;
+ output CLKOUT3;
+ output CLKOUT4;
+ output CLKOUT5;
+ output DRDY;
+ output LOCKED;
+ output [15:0] DO;
+ input CLKFBIN;
+ input CLKIN1;
+ input CLKIN2;
+ input CLKINSEL;
+ input DCLK;
+ input DEN;
+ input DWE;
+ input PWRDWN;
+ input RST;
+ input [15:0] DI;
+ input [6:0] DADDR;
+endmodule
+
+module PLLE2_BASE (...);
+ parameter BANDWIDTH = "OPTIMIZED";
+ parameter integer CLKFBOUT_MULT = 5;
+ parameter real CLKFBOUT_PHASE = 0.000;
+ parameter real CLKIN1_PERIOD = 0.000;
+ parameter integer CLKOUT0_DIVIDE = 1;
+ parameter real CLKOUT0_DUTY_CYCLE = 0.500;
+ parameter real CLKOUT0_PHASE = 0.000;
+ parameter integer CLKOUT1_DIVIDE = 1;
+ parameter real CLKOUT1_DUTY_CYCLE = 0.500;
+ parameter real CLKOUT1_PHASE = 0.000;
+ parameter integer CLKOUT2_DIVIDE = 1;
+ parameter real CLKOUT2_DUTY_CYCLE = 0.500;
+ parameter real CLKOUT2_PHASE = 0.000;
+ parameter integer CLKOUT3_DIVIDE = 1;
+ parameter real CLKOUT3_DUTY_CYCLE = 0.500;
+ parameter real CLKOUT3_PHASE = 0.000;
+ parameter integer CLKOUT4_DIVIDE = 1;
+ parameter real CLKOUT4_DUTY_CYCLE = 0.500;
+ parameter real CLKOUT4_PHASE = 0.000;
+ parameter integer CLKOUT5_DIVIDE = 1;
+ parameter real CLKOUT5_DUTY_CYCLE = 0.500;
+ parameter real CLKOUT5_PHASE = 0.000;
+ parameter integer DIVCLK_DIVIDE = 1;
+ parameter real REF_JITTER1 = 0.010;
+ parameter STARTUP_WAIT = "FALSE";
+ output CLKFBOUT;
+ output CLKOUT0;
+ output CLKOUT1;
+ output CLKOUT2;
+ output CLKOUT3;
+ output CLKOUT4;
+ output CLKOUT5;
+ output LOCKED;
+ input CLKFBIN;
+ input CLKIN1;
+ input PWRDWN;
+ input RST;
+endmodule
+
+module PULLDOWN (...);
+ output O;
+endmodule
+
+module PULLUP (...);
+ output O;
+endmodule
+
+module RAM128X1S (...);
+ parameter [127:0] INIT = 128'h00000000000000000000000000000000;
+ parameter [0:0] IS_WCLK_INVERTED = 1'b0;
+ output O;
+ input A0, A1, A2, A3, A4, A5, A6, D, WCLK, WE;
+endmodule
+
+module RAM256X1S (...);
+ parameter [255:0] INIT = 256'h0;
+ parameter [0:0] IS_WCLK_INVERTED = 1'b0;
+ output O;
+ input [7:0] A;
+ input D;
+ input WCLK;
+ input WE;
+endmodule
+
+module RAM32M (...);
+ parameter [63:0] INIT_A = 64'h0000000000000000;
+ parameter [63:0] INIT_B = 64'h0000000000000000;
+ parameter [63:0] INIT_C = 64'h0000000000000000;
+ parameter [63:0] INIT_D = 64'h0000000000000000;
+ parameter [0:0] IS_WCLK_INVERTED = 1'b0;
+ output [1:0] DOA;
+ output [1:0] DOB;
+ output [1:0] DOC;
+ output [1:0] DOD;
+ input [4:0] ADDRA;
+ input [4:0] ADDRB;
+ input [4:0] ADDRC;
+ input [4:0] ADDRD;
+ input [1:0] DIA;
+ input [1:0] DIB;
+ input [1:0] DIC;
+ input [1:0] DID;
+ input WCLK;
+ input WE;
+endmodule
+
+module RAM32X1D (...);
+ parameter [31:0] INIT = 32'h00000000;
+ parameter [0:0] IS_WCLK_INVERTED = 1'b0;
+ output DPO, SPO;
+ input A0, A1, A2, A3, A4, D, DPRA0, DPRA1, DPRA2, DPRA3, DPRA4, WCLK, WE;
+endmodule
+
+module RAM32X1S (...);
+ parameter [31:0] INIT = 32'h00000000;
+ parameter [0:0] IS_WCLK_INVERTED = 1'b0;
+ output O;
+ input A0, A1, A2, A3, A4, D, WCLK, WE;
+endmodule
+
+module RAM32X1S_1 (...);
+ parameter [31:0] INIT = 32'h00000000;
+ parameter [0:0] IS_WCLK_INVERTED = 1'b0;
+ output O;
+ input A0, A1, A2, A3, A4, D, WCLK, WE;
+endmodule
+
+module RAM32X2S (...);
+ parameter [31:0] INIT_00 = 32'h00000000;
+ parameter [31:0] INIT_01 = 32'h00000000;
+ parameter [0:0] IS_WCLK_INVERTED = 1'b0;
+ output O0, O1;
+ input A0, A1, A2, A3, A4, D0, D1, WCLK, WE;
+endmodule
+
+module RAM64M (...);
+ parameter [63:0] INIT_A = 64'h0000000000000000;
+ parameter [63:0] INIT_B = 64'h0000000000000000;
+ parameter [63:0] INIT_C = 64'h0000000000000000;
+ parameter [63:0] INIT_D = 64'h0000000000000000;
+ parameter [0:0] IS_WCLK_INVERTED = 1'b0;
+ output DOA;
+ output DOB;
+ output DOC;
+ output DOD;
+ input [5:0] ADDRA;
+ input [5:0] ADDRB;
+ input [5:0] ADDRC;
+ input [5:0] ADDRD;
+ input DIA;
+ input DIB;
+ input DIC;
+ input DID;
+ input WCLK;
+ input WE;
+endmodule
+
+module RAM64X1S (...);
+ parameter [63:0] INIT = 64'h0000000000000000;
+ parameter [0:0] IS_WCLK_INVERTED = 1'b0;
+ output O;
+ input A0, A1, A2, A3, A4, A5, D, WCLK, WE;
+endmodule
+
+module RAM64X1S_1 (...);
+ parameter [63:0] INIT = 64'h0000000000000000;
+ parameter [0:0] IS_WCLK_INVERTED = 1'b0;
+ output O;
+ input A0, A1, A2, A3, A4, A5, D, WCLK, WE;
+endmodule
+
+module RAM64X2S (...);
+ parameter [63:0] INIT_00 = 64'h0000000000000000;
+ parameter [63:0] INIT_01 = 64'h0000000000000000;
+ parameter [0:0] IS_WCLK_INVERTED = 1'b0;
+ output O0, O1;
+ input A0, A1, A2, A3, A4, A5, D0, D1, WCLK, WE;
+endmodule
+
+module ROM128X1 (...);
+ parameter [127:0] INIT = 128'h00000000000000000000000000000000;
+ output O;
+ input A0, A1, A2, A3, A4, A5, A6;
+endmodule
+
+module ROM256X1 (...);
+ parameter [255:0] INIT = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ output O;
+ input A0, A1, A2, A3, A4, A5, A6, A7;
+endmodule
+
+module ROM32X1 (...);
+ parameter [31:0] INIT = 32'h00000000;
+ output O;
+ input A0, A1, A2, A3, A4;
+endmodule
+
+module ROM64X1 (...);
+ parameter [63:0] INIT = 64'h0000000000000000;
+ output O;
+ input A0, A1, A2, A3, A4, A5;
+endmodule
+
+module SRL16E (...);
+ parameter [15:0] INIT = 16'h0000;
+ parameter [0:0] IS_CLK_INVERTED = 1'b0;
+ output Q;
+ input A0, A1, A2, A3, CE, CLK, D;
+endmodule
+
+module SRLC32E (...);
+ parameter [31:0] INIT = 32'h00000000;
+ parameter [0:0] IS_CLK_INVERTED = 1'b0;
+ output Q;
+ output Q31;
+ input [4:0] A;
+ input CE, CLK, D;
+endmodule
+
+module STARTUPE2 (...);
+ parameter PROG_USR = "FALSE";
+ parameter real SIM_CCLK_FREQ = 0.0;
+ output CFGCLK;
+ output CFGMCLK;
+ output EOS;
+ output PREQ;
+ input CLK;
+ input GSR;
+ input GTS;
+ input KEYCLEARB;
+ input PACK;
+ input USRCCLKO;
+ input USRCCLKTS;
+ input USRDONEO;
+ input USRDONETS;
+endmodule
+
+module USR_ACCESSE2 (...);
+ output CFGCLK;
+ output DATAVALID;
+ output [31:0] DATA;
+endmodule
+
+module XADC (...);
+ output BUSY;
+ output DRDY;
+ output EOC;
+ output EOS;
+ output JTAGBUSY;
+ output JTAGLOCKED;
+ output JTAGMODIFIED;
+ output OT;
+ output [15:0] DO;
+ output [7:0] ALM;
+ output [4:0] CHANNEL;
+ output [4:0] MUXADDR;
+ input CONVST;
+ input CONVSTCLK;
+ input DCLK;
+ input DEN;
+ input DWE;
+ input RESET;
+ input VN;
+ input VP;
+ input [15:0] DI;
+ input [15:0] VAUXN;
+ input [15:0] VAUXP;
+ input [6:0] DADDR;
+ parameter [15:0] INIT_40 = 16'h0;
+ parameter [15:0] INIT_41 = 16'h0;
+ parameter [15:0] INIT_42 = 16'h0800;
+ parameter [15:0] INIT_43 = 16'h0;
+ parameter [15:0] INIT_44 = 16'h0;
+ parameter [15:0] INIT_45 = 16'h0;
+ parameter [15:0] INIT_46 = 16'h0;
+ parameter [15:0] INIT_47 = 16'h0;
+ parameter [15:0] INIT_48 = 16'h0;
+ parameter [15:0] INIT_49 = 16'h0;
+ parameter [15:0] INIT_4A = 16'h0;
+ parameter [15:0] INIT_4B = 16'h0;
+ parameter [15:0] INIT_4C = 16'h0;
+ parameter [15:0] INIT_4D = 16'h0;
+ parameter [15:0] INIT_4E = 16'h0;
+ parameter [15:0] INIT_4F = 16'h0;
+ parameter [15:0] INIT_50 = 16'h0;
+ parameter [15:0] INIT_51 = 16'h0;
+ parameter [15:0] INIT_52 = 16'h0;
+ parameter [15:0] INIT_53 = 16'h0;
+ parameter [15:0] INIT_54 = 16'h0;
+ parameter [15:0] INIT_55 = 16'h0;
+ parameter [15:0] INIT_56 = 16'h0;
+ parameter [15:0] INIT_57 = 16'h0;
+ parameter [15:0] INIT_58 = 16'h0;
+ parameter [15:0] INIT_59 = 16'h0;
+ parameter [15:0] INIT_5A = 16'h0;
+ parameter [15:0] INIT_5B = 16'h0;
+ parameter [15:0] INIT_5C = 16'h0;
+ parameter [15:0] INIT_5D = 16'h0;
+ parameter [15:0] INIT_5E = 16'h0;
+ parameter [15:0] INIT_5F = 16'h0;
+ parameter IS_CONVSTCLK_INVERTED = 1'b0;
+ parameter IS_DCLK_INVERTED = 1'b0;
+ parameter SIM_DEVICE = "7SERIES";
+ parameter SIM_MONITOR_FILE = "design.txt";
+endmodule
+
diff --git a/techlibs/xilinx/synth_xilinx.cc b/techlibs/xilinx/synth_xilinx.cc
index 21d1fb1e..e7ec1e6e 100644
--- a/techlibs/xilinx/synth_xilinx.cc
+++ b/techlibs/xilinx/synth_xilinx.cc
@@ -69,6 +69,7 @@ struct SynthXilinxPass : public Pass {
log("\n");
log(" begin:\n");
log(" read_verilog -lib +/xilinx/cells_sim.v\n");
+ log(" read_verilog -lib +/xilinx/cells_xtra.v\n");
log(" read_verilog -lib +/xilinx/brams_bb.v\n");
log(" read_verilog -lib +/xilinx/drams_bb.v\n");
log(" hierarchy -check -top <top>\n");
@@ -159,12 +160,13 @@ struct SynthXilinxPass : public Pass {
bool active = run_from.empty();
- log_header("Executing SYNTH_XILINX pass.\n");
+ log_header(design, "Executing SYNTH_XILINX pass.\n");
log_push();
if (check_label(active, run_from, run_to, "begin"))
{
Pass::call(design, "read_verilog -lib +/xilinx/cells_sim.v");
+ Pass::call(design, "read_verilog -lib +/xilinx/cells_xtra.v");
Pass::call(design, "read_verilog -lib +/xilinx/brams_bb.v");
Pass::call(design, "read_verilog -lib +/xilinx/drams_bb.v");
Pass::call(design, stringf("hierarchy -check %s", top_opt.c_str()));