mirror of https://github.com/YosysHQ/yosys.git
Merge remote-tracking branch 'upstream/master'
This commit is contained in:
commit
509f729e55
|
@ -163,20 +163,20 @@ struct FirrtlWorker
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
/* Memories defined within this module. */
|
/* Memories defined within this module. */
|
||||||
struct memory {
|
struct memory {
|
||||||
Cell *pCell; // for error reporting
|
Cell *pCell; // for error reporting
|
||||||
string name; // memory name
|
string name; // memory name
|
||||||
int abits; // number of address bits
|
int abits; // number of address bits
|
||||||
int size; // size (in units) of the memory
|
int size; // size (in units) of the memory
|
||||||
int width; // size (in bits) of each element
|
int width; // size (in bits) of each element
|
||||||
int read_latency;
|
int read_latency;
|
||||||
int write_latency;
|
int write_latency;
|
||||||
vector<read_port> read_ports;
|
vector<read_port> read_ports;
|
||||||
vector<write_port> write_ports;
|
vector<write_port> write_ports;
|
||||||
std::string init_file;
|
std::string init_file;
|
||||||
std::string init_file_srcFileSpec;
|
std::string init_file_srcFileSpec;
|
||||||
string srcLine;
|
string srcLine;
|
||||||
memory(Cell *pCell, string name, int abits, int size, int width) : pCell(pCell), name(name), abits(abits), size(size), width(width), read_latency(0), write_latency(1), init_file(""), init_file_srcFileSpec("") {
|
memory(Cell *pCell, string name, int abits, int size, int width) : pCell(pCell), name(name), abits(abits), size(size), width(width), read_latency(0), write_latency(1), init_file(""), init_file_srcFileSpec("") {
|
||||||
// Provide defaults for abits or size if one (but not the other) is specified.
|
// Provide defaults for abits or size if one (but not the other) is specified.
|
||||||
if (this->abits == 0 && this->size != 0) {
|
if (this->abits == 0 && this->size != 0) {
|
||||||
this->abits = ceil_log2(this->size);
|
this->abits = ceil_log2(this->size);
|
||||||
|
@ -206,18 +206,18 @@ struct FirrtlWorker
|
||||||
}
|
}
|
||||||
return srcLine.c_str();
|
return srcLine.c_str();
|
||||||
}
|
}
|
||||||
void add_memory_read_port(read_port &rp) {
|
void add_memory_read_port(read_port &rp) {
|
||||||
read_ports.push_back(rp);
|
read_ports.push_back(rp);
|
||||||
}
|
}
|
||||||
void add_memory_write_port(write_port &wp) {
|
void add_memory_write_port(write_port &wp) {
|
||||||
write_ports.push_back(wp);
|
write_ports.push_back(wp);
|
||||||
}
|
}
|
||||||
void add_memory_file(std::string init_file, std::string init_file_srcFileSpec) {
|
void add_memory_file(std::string init_file, std::string init_file_srcFileSpec) {
|
||||||
this->init_file = init_file;
|
this->init_file = init_file;
|
||||||
this->init_file_srcFileSpec = init_file_srcFileSpec;
|
this->init_file_srcFileSpec = init_file_srcFileSpec;
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
dict<string, memory> memories;
|
dict<string, memory> memories;
|
||||||
|
|
||||||
void register_memory(memory &m)
|
void register_memory(memory &m)
|
||||||
|
|
|
@ -178,7 +178,17 @@ struct ShregmapTechXilinx7 : ShregmapTech
|
||||||
|
|
||||||
// Only map if $shiftx exclusively covers the shift register
|
// Only map if $shiftx exclusively covers the shift register
|
||||||
if (shiftx->type == "$shiftx") {
|
if (shiftx->type == "$shiftx") {
|
||||||
if (GetSize(taps) != shiftx->getParam("\\A_WIDTH").as_int())
|
if (GetSize(taps) > shiftx->getParam("\\A_WIDTH").as_int())
|
||||||
|
return false;
|
||||||
|
// Due to padding the most significant bits of A may be 1'bx,
|
||||||
|
// and if so, discount them
|
||||||
|
if (GetSize(taps) < shiftx->getParam("\\A_WIDTH").as_int()) {
|
||||||
|
const SigSpec A = shiftx->getPort("\\A");
|
||||||
|
const int A_width = shiftx->getParam("\\A_WIDTH").as_int();
|
||||||
|
for (int i = GetSize(taps); i < A_width; ++i)
|
||||||
|
if (A[i] != RTLIL::Sx) return false;
|
||||||
|
}
|
||||||
|
else if (GetSize(taps) != shiftx->getParam("\\A_WIDTH").as_int())
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else if (shiftx->type == "$mux") {
|
else if (shiftx->type == "$mux") {
|
||||||
|
|
|
@ -17,6 +17,14 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// Convert negative-polarity reset to positive-polarity
|
||||||
|
module \$_DFF_NN0_ (input D, C, R, output Q); \$_DFF_NP0_ _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .R(~R)); endmodule
|
||||||
|
module \$_DFF_PN0_ (input D, C, R, output Q); \$_DFF_PP0_ _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .R(~R)); endmodule
|
||||||
|
|
||||||
|
module \$_DFF_NN1_ (input D, C, R, output Q); \$_DFF_NP1 _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .R(~R)); endmodule
|
||||||
|
module \$_DFF_PN1_ (input D, C, R, output Q); \$_DFF_PP1 _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .R(~R)); endmodule
|
||||||
|
|
||||||
|
|
||||||
module \$__SHREG_ (input C, input D, input E, output Q);
|
module \$__SHREG_ (input C, input D, input E, output Q);
|
||||||
parameter DEPTH = 0;
|
parameter DEPTH = 0;
|
||||||
parameter [DEPTH-1:0] INIT = 0;
|
parameter [DEPTH-1:0] INIT = 0;
|
||||||
|
|
|
@ -22,26 +22,21 @@
|
||||||
|
|
||||||
`ifndef _NO_FFS
|
`ifndef _NO_FFS
|
||||||
|
|
||||||
`ifndef _NO_POS_SR
|
|
||||||
module \$_DFF_N_ (input D, C, output Q); FDRE_1 #(.INIT(|0)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(1'b1), .R(1'b0)); endmodule
|
module \$_DFF_N_ (input D, C, output Q); FDRE_1 #(.INIT(|0)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(1'b1), .R(1'b0)); endmodule
|
||||||
module \$_DFF_P_ (input D, C, output Q); FDRE #(.INIT(|0)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(1'b1), .R(1'b0)); endmodule
|
module \$_DFF_P_ (input D, C, output Q); FDRE #(.INIT(|0)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(1'b1), .R(1'b0)); endmodule
|
||||||
|
|
||||||
module \$_DFFE_NP_ (input D, C, E, output Q); FDRE_1 #(.INIT(|0)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(E), .R(1'b0)); endmodule
|
module \$_DFFE_NP_ (input D, C, E, output Q); FDRE_1 #(.INIT(|0)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(E), .R(1'b0)); endmodule
|
||||||
module \$_DFFE_PP_ (input D, C, E, output Q); FDRE #(.INIT(|0)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(E), .R(1'b0)); endmodule
|
module \$_DFFE_PP_ (input D, C, E, output Q); FDRE #(.INIT(|0)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(E), .R(1'b0)); endmodule
|
||||||
|
|
||||||
|
module \$_DFF_NN0_ (input D, C, R, output Q); FDCE_1 #(.INIT(|0)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(1'b1), .CLR(!R)); endmodule
|
||||||
module \$_DFF_NP0_ (input D, C, R, output Q); FDCE_1 #(.INIT(|0)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(1'b1), .CLR( R)); endmodule
|
module \$_DFF_NP0_ (input D, C, R, output Q); FDCE_1 #(.INIT(|0)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(1'b1), .CLR( R)); endmodule
|
||||||
|
module \$_DFF_PN0_ (input D, C, R, output Q); FDCE #(.INIT(|0)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(1'b1), .CLR(!R)); endmodule
|
||||||
module \$_DFF_PP0_ (input D, C, R, output Q); FDCE #(.INIT(|0)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(1'b1), .CLR( R)); endmodule
|
module \$_DFF_PP0_ (input D, C, R, output Q); FDCE #(.INIT(|0)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(1'b1), .CLR( R)); endmodule
|
||||||
|
|
||||||
|
module \$_DFF_NN1_ (input D, C, R, output Q); FDPE_1 #(.INIT(|0)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(1'b1), .PRE(!R)); endmodule
|
||||||
module \$_DFF_NP1_ (input D, C, R, output Q); FDPE_1 #(.INIT(|0)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(1'b1), .PRE( R)); endmodule
|
module \$_DFF_NP1_ (input D, C, R, output Q); FDPE_1 #(.INIT(|0)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(1'b1), .PRE( R)); endmodule
|
||||||
|
module \$_DFF_PN1_ (input D, C, R, output Q); FDPE #(.INIT(|0)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(1'b1), .PRE(!R)); endmodule
|
||||||
module \$_DFF_PP1_ (input D, C, R, output Q); FDPE #(.INIT(|0)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(1'b1), .PRE( R)); endmodule
|
module \$_DFF_PP1_ (input D, C, R, output Q); FDPE #(.INIT(|0)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(1'b1), .PRE( R)); endmodule
|
||||||
`endif
|
|
||||||
|
|
||||||
module \$_DFF_NN0_ (input D, C, R, output Q); \$_DFF_NP0_ _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .R(~R)); endmodule
|
|
||||||
module \$_DFF_PN0_ (input D, C, R, output Q); \$_DFF_PP0_ _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .R(~R)); endmodule
|
|
||||||
|
|
||||||
module \$_DFF_NN1_ (input D, C, R, output Q); \$_DFF_NP1 _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .R(~R)); endmodule
|
|
||||||
module \$_DFF_PN1_ (input D, C, R, output Q); \$_DFF_PP1 _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .R(~R)); endmodule
|
|
||||||
`endif
|
|
||||||
|
|
||||||
`endif
|
`endif
|
||||||
|
|
||||||
|
|
|
@ -205,45 +205,41 @@ struct SynthXilinxPass : public ScriptPass
|
||||||
}
|
}
|
||||||
|
|
||||||
if (check_label("fine")) {
|
if (check_label("fine")) {
|
||||||
run("opt -fast");
|
// shregmap -tech xilinx can cope with $shiftx and $mux
|
||||||
|
// cells for identifiying variable-length shift registers,
|
||||||
|
// so attempt to convert $pmux-es to the former
|
||||||
|
if (!nosrl || help_mode)
|
||||||
|
run("pmux2shiftx", "(skip if '-nosrl')");
|
||||||
|
|
||||||
|
run("opt -fast -full");
|
||||||
run("memory_map");
|
run("memory_map");
|
||||||
run("dffsr2dff");
|
run("dffsr2dff");
|
||||||
run("dff2dffe");
|
run("dff2dffe");
|
||||||
|
run("opt -full");
|
||||||
|
|
||||||
if (!vpr || help_mode)
|
if (!vpr || help_mode)
|
||||||
run("techmap -map +/xilinx/arith_map.v");
|
run("techmap -map +/xilinx/arith_map.v");
|
||||||
else
|
else
|
||||||
run("techmap -map +/xilinx/arith_map.v -D _EXPLICIT_CARRY");
|
run("techmap -map +/xilinx/arith_map.v -D _EXPLICIT_CARRY");
|
||||||
|
|
||||||
run("hierarchy -check");
|
|
||||||
run("opt -fast");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (check_label("map_cells"))
|
|
||||||
{
|
|
||||||
if (!nosrl || help_mode) {
|
if (!nosrl || help_mode) {
|
||||||
// shregmap operates on bit-level flops, not word-level,
|
// shregmap operates on bit-level flops, not word-level,
|
||||||
// so break those down here
|
// so break those down here
|
||||||
run("simplemap t:$dff t:$dffe", "(skip if '-nosrl')");
|
run("simplemap t:$dff t:$dffe", "(skip if '-nosrl')");
|
||||||
// shregmap -tech xilinx can cope with $shiftx and $mux
|
|
||||||
// cells for identifiying variable-length shift registers,
|
|
||||||
// so attempt to convert $pmux-es to the former
|
|
||||||
run("pmux2shiftx", "(skip if '-nosrl')");
|
|
||||||
// pmux2shiftx can leave behind a $pmux with a single entry
|
|
||||||
// -- need this to clean that up before shregmap
|
|
||||||
run("opt_expr -mux_undef", "(skip if '-nosrl')");
|
|
||||||
// shregmap with '-tech xilinx' infers variable length shift regs
|
// shregmap with '-tech xilinx' infers variable length shift regs
|
||||||
run("shregmap -tech xilinx -minlen 3", "(skip if '-nosrl')");
|
run("shregmap -tech xilinx -minlen 3", "(skip if '-nosrl')");
|
||||||
}
|
}
|
||||||
|
|
||||||
run("techmap -map +/xilinx/cells_map.v");
|
run("techmap");
|
||||||
|
run("opt -fast");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (check_label("map_cells")) {
|
||||||
|
run("techmap -map +/techmap.v -map +/xilinx/cells_map.v");
|
||||||
run("clean");
|
run("clean");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (check_label("map_luts"))
|
if (check_label("map_luts")) {
|
||||||
{
|
|
||||||
run("opt -full");
|
|
||||||
run("techmap -map +/techmap.v -D _NO_POS_SR -map +/xilinx/ff_map.v");
|
|
||||||
if (help_mode)
|
if (help_mode)
|
||||||
run("abc -luts 2:2,3,6:5,10,20 [-dff]");
|
run("abc -luts 2:2,3,6:5,10,20 [-dff]");
|
||||||
else
|
else
|
||||||
|
@ -259,21 +255,18 @@ struct SynthXilinxPass : public ScriptPass
|
||||||
run("clean");
|
run("clean");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (check_label("check"))
|
if (check_label("check")) {
|
||||||
{
|
|
||||||
run("hierarchy -check");
|
run("hierarchy -check");
|
||||||
run("stat");
|
run("stat");
|
||||||
run("check -noinit");
|
run("check -noinit");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (check_label("edif"))
|
if (check_label("edif")) {
|
||||||
{
|
|
||||||
if (!edif_file.empty() || help_mode)
|
if (!edif_file.empty() || help_mode)
|
||||||
run(stringf("write_edif -pvector bra %s", edif_file.c_str()));
|
run(stringf("write_edif -pvector bra %s", edif_file.c_str()));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (check_label("blif"))
|
if (check_label("blif")) {
|
||||||
{
|
|
||||||
if (!blif_file.empty() || help_mode)
|
if (!blif_file.empty() || help_mode)
|
||||||
run(stringf("write_blif %s", edif_file.c_str()));
|
run(stringf("write_blif %s", edif_file.c_str()));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue