mirror of https://github.com/YosysHQ/yosys.git
Merge pull request #1818 from YosysHQ/mwk/new-ff-types
Add new FF types to library.
This commit is contained in:
commit
2a59cd9ed0
|
@ -139,8 +139,14 @@ struct CellTypes
|
||||||
setup_type(ID($dff), {ID::CLK, ID::D}, {ID::Q});
|
setup_type(ID($dff), {ID::CLK, ID::D}, {ID::Q});
|
||||||
setup_type(ID($dffe), {ID::CLK, ID::EN, ID::D}, {ID::Q});
|
setup_type(ID($dffe), {ID::CLK, ID::EN, ID::D}, {ID::Q});
|
||||||
setup_type(ID($dffsr), {ID::CLK, ID::SET, ID::CLR, ID::D}, {ID::Q});
|
setup_type(ID($dffsr), {ID::CLK, ID::SET, ID::CLR, ID::D}, {ID::Q});
|
||||||
|
setup_type(ID($dffsre), {ID::CLK, ID::SET, ID::CLR, ID::D, ID::E}, {ID::Q});
|
||||||
setup_type(ID($adff), {ID::CLK, ID::ARST, ID::D}, {ID::Q});
|
setup_type(ID($adff), {ID::CLK, ID::ARST, ID::D}, {ID::Q});
|
||||||
|
setup_type(ID($adffe), {ID::CLK, ID::ARST, ID::D, ID::E}, {ID::Q});
|
||||||
|
setup_type(ID($sdff), {ID::CLK, ID::SRST, ID::D}, {ID::Q});
|
||||||
|
setup_type(ID($sdffe), {ID::CLK, ID::SRST, ID::D, ID::E}, {ID::Q});
|
||||||
|
setup_type(ID($sdffce), {ID::CLK, ID::SRST, ID::D, ID::E}, {ID::Q});
|
||||||
setup_type(ID($dlatch), {ID::EN, ID::D}, {ID::Q});
|
setup_type(ID($dlatch), {ID::EN, ID::D}, {ID::Q});
|
||||||
|
setup_type(ID($adlatch), {ID::EN, ID::D, ID::ARST}, {ID::Q});
|
||||||
setup_type(ID($dlatchsr), {ID::EN, ID::SET, ID::CLR, ID::D}, {ID::Q});
|
setup_type(ID($dlatchsr), {ID::EN, ID::SET, ID::CLR, ID::D}, {ID::Q});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -208,14 +214,48 @@ struct CellTypes
|
||||||
for (auto c3 : list_01)
|
for (auto c3 : list_01)
|
||||||
setup_type(stringf("$_DFF_%c%c%c_", c1, c2, c3), {ID::C, ID::R, ID::D}, {ID::Q});
|
setup_type(stringf("$_DFF_%c%c%c_", c1, c2, c3), {ID::C, ID::R, ID::D}, {ID::Q});
|
||||||
|
|
||||||
|
for (auto c1 : list_np)
|
||||||
|
for (auto c2 : list_np)
|
||||||
|
for (auto c3 : list_01)
|
||||||
|
for (auto c4 : list_np)
|
||||||
|
setup_type(stringf("$_DFFE_%c%c%c%c_", c1, c2, c3, c4), {ID::C, ID::R, ID::D, ID::E}, {ID::Q});
|
||||||
|
|
||||||
for (auto c1 : list_np)
|
for (auto c1 : list_np)
|
||||||
for (auto c2 : list_np)
|
for (auto c2 : list_np)
|
||||||
for (auto c3 : list_np)
|
for (auto c3 : list_np)
|
||||||
setup_type(stringf("$_DFFSR_%c%c%c_", c1, c2, c3), {ID::C, ID::S, ID::R, ID::D}, {ID::Q});
|
setup_type(stringf("$_DFFSR_%c%c%c_", c1, c2, c3), {ID::C, ID::S, ID::R, ID::D}, {ID::Q});
|
||||||
|
|
||||||
|
for (auto c1 : list_np)
|
||||||
|
for (auto c2 : list_np)
|
||||||
|
for (auto c3 : list_np)
|
||||||
|
for (auto c4 : list_np)
|
||||||
|
setup_type(stringf("$_DFFSRE_%c%c%c%c_", c1, c2, c3, c4), {ID::C, ID::S, ID::R, ID::D, ID::E}, {ID::Q});
|
||||||
|
|
||||||
|
for (auto c1 : list_np)
|
||||||
|
for (auto c2 : list_np)
|
||||||
|
for (auto c3 : list_01)
|
||||||
|
setup_type(stringf("$_SDFF_%c%c%c_", c1, c2, c3), {ID::C, ID::R, ID::D}, {ID::Q});
|
||||||
|
|
||||||
|
for (auto c1 : list_np)
|
||||||
|
for (auto c2 : list_np)
|
||||||
|
for (auto c3 : list_01)
|
||||||
|
for (auto c4 : list_np)
|
||||||
|
setup_type(stringf("$_SDFFE_%c%c%c%c_", c1, c2, c3, c4), {ID::C, ID::R, ID::D, ID::E}, {ID::Q});
|
||||||
|
|
||||||
|
for (auto c1 : list_np)
|
||||||
|
for (auto c2 : list_np)
|
||||||
|
for (auto c3 : list_01)
|
||||||
|
for (auto c4 : list_np)
|
||||||
|
setup_type(stringf("$_SDFFCE_%c%c%c%c_", c1, c2, c3, c4), {ID::C, ID::R, ID::D, ID::E}, {ID::Q});
|
||||||
|
|
||||||
for (auto c1 : list_np)
|
for (auto c1 : list_np)
|
||||||
setup_type(stringf("$_DLATCH_%c_", c1), {ID::E, ID::D}, {ID::Q});
|
setup_type(stringf("$_DLATCH_%c_", c1), {ID::E, ID::D}, {ID::Q});
|
||||||
|
|
||||||
|
for (auto c1 : list_np)
|
||||||
|
for (auto c2 : list_np)
|
||||||
|
for (auto c3 : list_01)
|
||||||
|
setup_type(stringf("$_DLATCH_%c%c%c_", c1, c2, c3), {ID::E, ID::R, ID::D}, {ID::Q});
|
||||||
|
|
||||||
for (auto c1 : list_np)
|
for (auto c1 : list_np)
|
||||||
for (auto c2 : list_np)
|
for (auto c2 : list_np)
|
||||||
for (auto c3 : list_np)
|
for (auto c3 : list_np)
|
||||||
|
|
|
@ -158,6 +158,9 @@ X(SRC_EN)
|
||||||
X(SRC_PEN)
|
X(SRC_PEN)
|
||||||
X(SRC_POL)
|
X(SRC_POL)
|
||||||
X(SRC_WIDTH)
|
X(SRC_WIDTH)
|
||||||
|
X(SRST)
|
||||||
|
X(SRST_POLARITY)
|
||||||
|
X(SRST_VALUE)
|
||||||
X(STATE_BITS)
|
X(STATE_BITS)
|
||||||
X(STATE_NUM)
|
X(STATE_NUM)
|
||||||
X(STATE_NUM_LOG2)
|
X(STATE_NUM_LOG2)
|
||||||
|
|
450
kernel/rtlil.cc
450
kernel/rtlil.cc
|
@ -54,8 +54,14 @@ const pool<IdString> &RTLIL::builtin_ff_cell_types() {
|
||||||
ID($dff),
|
ID($dff),
|
||||||
ID($dffe),
|
ID($dffe),
|
||||||
ID($dffsr),
|
ID($dffsr),
|
||||||
|
ID($dffsre),
|
||||||
ID($adff),
|
ID($adff),
|
||||||
|
ID($adffe),
|
||||||
|
ID($sdff),
|
||||||
|
ID($sdffe),
|
||||||
|
ID($sdffce),
|
||||||
ID($dlatch),
|
ID($dlatch),
|
||||||
|
ID($adlatch),
|
||||||
ID($dlatchsr),
|
ID($dlatchsr),
|
||||||
ID($_DFFE_NN_),
|
ID($_DFFE_NN_),
|
||||||
ID($_DFFE_NP_),
|
ID($_DFFE_NP_),
|
||||||
|
@ -69,16 +75,102 @@ const pool<IdString> &RTLIL::builtin_ff_cell_types() {
|
||||||
ID($_DFFSR_PNP_),
|
ID($_DFFSR_PNP_),
|
||||||
ID($_DFFSR_PPN_),
|
ID($_DFFSR_PPN_),
|
||||||
ID($_DFFSR_PPP_),
|
ID($_DFFSR_PPP_),
|
||||||
|
ID($_DFFSRE_NNNN_),
|
||||||
|
ID($_DFFSRE_NNNP_),
|
||||||
|
ID($_DFFSRE_NNPN_),
|
||||||
|
ID($_DFFSRE_NNPP_),
|
||||||
|
ID($_DFFSRE_NPNN_),
|
||||||
|
ID($_DFFSRE_NPNP_),
|
||||||
|
ID($_DFFSRE_NPPN_),
|
||||||
|
ID($_DFFSRE_NPPP_),
|
||||||
|
ID($_DFFSRE_PNNN_),
|
||||||
|
ID($_DFFSRE_PNNP_),
|
||||||
|
ID($_DFFSRE_PNPN_),
|
||||||
|
ID($_DFFSRE_PNPP_),
|
||||||
|
ID($_DFFSRE_PPNN_),
|
||||||
|
ID($_DFFSRE_PPNP_),
|
||||||
|
ID($_DFFSRE_PPPN_),
|
||||||
|
ID($_DFFSRE_PPPP_),
|
||||||
|
ID($_DFF_N_),
|
||||||
|
ID($_DFF_P_),
|
||||||
ID($_DFF_NN0_),
|
ID($_DFF_NN0_),
|
||||||
ID($_DFF_NN1_),
|
ID($_DFF_NN1_),
|
||||||
ID($_DFF_NP0_),
|
ID($_DFF_NP0_),
|
||||||
ID($_DFF_NP1_),
|
ID($_DFF_NP1_),
|
||||||
ID($_DFF_N_),
|
|
||||||
ID($_DFF_PN0_),
|
ID($_DFF_PN0_),
|
||||||
ID($_DFF_PN1_),
|
ID($_DFF_PN1_),
|
||||||
ID($_DFF_PP0_),
|
ID($_DFF_PP0_),
|
||||||
ID($_DFF_PP1_),
|
ID($_DFF_PP1_),
|
||||||
ID($_DFF_P_),
|
ID($_DFFE_NN0N_),
|
||||||
|
ID($_DFFE_NN0P_),
|
||||||
|
ID($_DFFE_NN1N_),
|
||||||
|
ID($_DFFE_NN1P_),
|
||||||
|
ID($_DFFE_NP0N_),
|
||||||
|
ID($_DFFE_NP0P_),
|
||||||
|
ID($_DFFE_NP1N_),
|
||||||
|
ID($_DFFE_NP1P_),
|
||||||
|
ID($_DFFE_PN0N_),
|
||||||
|
ID($_DFFE_PN0P_),
|
||||||
|
ID($_DFFE_PN1N_),
|
||||||
|
ID($_DFFE_PN1P_),
|
||||||
|
ID($_DFFE_PP0N_),
|
||||||
|
ID($_DFFE_PP0P_),
|
||||||
|
ID($_DFFE_PP1N_),
|
||||||
|
ID($_DFFE_PP1P_),
|
||||||
|
ID($_SDFF_NN0_),
|
||||||
|
ID($_SDFF_NN1_),
|
||||||
|
ID($_SDFF_NP0_),
|
||||||
|
ID($_SDFF_NP1_),
|
||||||
|
ID($_SDFF_PN0_),
|
||||||
|
ID($_SDFF_PN1_),
|
||||||
|
ID($_SDFF_PP0_),
|
||||||
|
ID($_SDFF_PP1_),
|
||||||
|
ID($_SDFFE_NN0N_),
|
||||||
|
ID($_SDFFE_NN0P_),
|
||||||
|
ID($_SDFFE_NN1N_),
|
||||||
|
ID($_SDFFE_NN1P_),
|
||||||
|
ID($_SDFFE_NP0N_),
|
||||||
|
ID($_SDFFE_NP0P_),
|
||||||
|
ID($_SDFFE_NP1N_),
|
||||||
|
ID($_SDFFE_NP1P_),
|
||||||
|
ID($_SDFFE_PN0N_),
|
||||||
|
ID($_SDFFE_PN0P_),
|
||||||
|
ID($_SDFFE_PN1N_),
|
||||||
|
ID($_SDFFE_PN1P_),
|
||||||
|
ID($_SDFFE_PP0N_),
|
||||||
|
ID($_SDFFE_PP0P_),
|
||||||
|
ID($_SDFFE_PP1N_),
|
||||||
|
ID($_SDFFE_PP1P_),
|
||||||
|
ID($_SDFFCE_NN0N_),
|
||||||
|
ID($_SDFFCE_NN0P_),
|
||||||
|
ID($_SDFFCE_NN1N_),
|
||||||
|
ID($_SDFFCE_NN1P_),
|
||||||
|
ID($_SDFFCE_NP0N_),
|
||||||
|
ID($_SDFFCE_NP0P_),
|
||||||
|
ID($_SDFFCE_NP1N_),
|
||||||
|
ID($_SDFFCE_NP1P_),
|
||||||
|
ID($_SDFFCE_PN0N_),
|
||||||
|
ID($_SDFFCE_PN0P_),
|
||||||
|
ID($_SDFFCE_PN1N_),
|
||||||
|
ID($_SDFFCE_PN1P_),
|
||||||
|
ID($_SDFFCE_PP0N_),
|
||||||
|
ID($_SDFFCE_PP0P_),
|
||||||
|
ID($_SDFFCE_PP1N_),
|
||||||
|
ID($_SDFFCE_PP1P_),
|
||||||
|
ID($_SR_NN_),
|
||||||
|
ID($_SR_NP_),
|
||||||
|
ID($_SR_PN_),
|
||||||
|
ID($_SR_PP_),
|
||||||
|
ID($_DLATCH_N_),
|
||||||
|
ID($_DLATCH_P_),
|
||||||
|
ID($_DLATCH_NN0_),
|
||||||
|
ID($_DLATCH_NN1_),
|
||||||
|
ID($_DLATCH_NP0_),
|
||||||
|
ID($_DLATCH_NP1_),
|
||||||
|
ID($_DLATCH_PN0_),
|
||||||
|
ID($_DLATCH_PN1_),
|
||||||
|
ID($_DLATCH_PP0_),
|
||||||
|
ID($_DLATCH_PP1_),
|
||||||
ID($_DLATCHSR_NNN_),
|
ID($_DLATCHSR_NNN_),
|
||||||
ID($_DLATCHSR_NNP_),
|
ID($_DLATCHSR_NNP_),
|
||||||
ID($_DLATCHSR_NPN_),
|
ID($_DLATCHSR_NPN_),
|
||||||
|
@ -87,8 +179,6 @@ const pool<IdString> &RTLIL::builtin_ff_cell_types() {
|
||||||
ID($_DLATCHSR_PNP_),
|
ID($_DLATCHSR_PNP_),
|
||||||
ID($_DLATCHSR_PPN_),
|
ID($_DLATCHSR_PPN_),
|
||||||
ID($_DLATCHSR_PPP_),
|
ID($_DLATCHSR_PPP_),
|
||||||
ID($_DLATCH_N_),
|
|
||||||
ID($_DLATCH_P_),
|
|
||||||
ID($_FF_),
|
ID($_FF_),
|
||||||
};
|
};
|
||||||
return res;
|
return res;
|
||||||
|
@ -1139,6 +1229,21 @@ namespace {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (cell->type == ID($dffsre)) {
|
||||||
|
param_bool(ID::CLK_POLARITY);
|
||||||
|
param_bool(ID::SET_POLARITY);
|
||||||
|
param_bool(ID::CLR_POLARITY);
|
||||||
|
param_bool(ID::EN_POLARITY);
|
||||||
|
port(ID::CLK, 1);
|
||||||
|
port(ID::EN, 1);
|
||||||
|
port(ID::SET, param(ID::WIDTH));
|
||||||
|
port(ID::CLR, param(ID::WIDTH));
|
||||||
|
port(ID::D, param(ID::WIDTH));
|
||||||
|
port(ID::Q, param(ID::WIDTH));
|
||||||
|
check_expected();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (cell->type == ID($adff)) {
|
if (cell->type == ID($adff)) {
|
||||||
param_bool(ID::CLK_POLARITY);
|
param_bool(ID::CLK_POLARITY);
|
||||||
param_bool(ID::ARST_POLARITY);
|
param_bool(ID::ARST_POLARITY);
|
||||||
|
@ -1151,6 +1256,46 @@ namespace {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (cell->type == ID($sdff)) {
|
||||||
|
param_bool(ID::CLK_POLARITY);
|
||||||
|
param_bool(ID::SRST_POLARITY);
|
||||||
|
param_bits(ID::SRST_VALUE, param(ID::WIDTH));
|
||||||
|
port(ID::CLK, 1);
|
||||||
|
port(ID::SRST, 1);
|
||||||
|
port(ID::D, param(ID::WIDTH));
|
||||||
|
port(ID::Q, param(ID::WIDTH));
|
||||||
|
check_expected();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cell->type.in(ID($sdffe), ID($sdffce))) {
|
||||||
|
param_bool(ID::CLK_POLARITY);
|
||||||
|
param_bool(ID::EN_POLARITY);
|
||||||
|
param_bool(ID::SRST_POLARITY);
|
||||||
|
param_bits(ID::SRST_VALUE, param(ID::WIDTH));
|
||||||
|
port(ID::CLK, 1);
|
||||||
|
port(ID::EN, 1);
|
||||||
|
port(ID::SRST, 1);
|
||||||
|
port(ID::D, param(ID::WIDTH));
|
||||||
|
port(ID::Q, param(ID::WIDTH));
|
||||||
|
check_expected();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cell->type == ID($adffe)) {
|
||||||
|
param_bool(ID::CLK_POLARITY);
|
||||||
|
param_bool(ID::EN_POLARITY);
|
||||||
|
param_bool(ID::ARST_POLARITY);
|
||||||
|
param_bits(ID::ARST_VALUE, param(ID::WIDTH));
|
||||||
|
port(ID::CLK, 1);
|
||||||
|
port(ID::EN, 1);
|
||||||
|
port(ID::ARST, 1);
|
||||||
|
port(ID::D, param(ID::WIDTH));
|
||||||
|
port(ID::Q, param(ID::WIDTH));
|
||||||
|
check_expected();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (cell->type == ID($dlatch)) {
|
if (cell->type == ID($dlatch)) {
|
||||||
param_bool(ID::EN_POLARITY);
|
param_bool(ID::EN_POLARITY);
|
||||||
port(ID::EN, 1);
|
port(ID::EN, 1);
|
||||||
|
@ -1160,6 +1305,18 @@ namespace {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (cell->type == ID($adlatch)) {
|
||||||
|
param_bool(ID::EN_POLARITY);
|
||||||
|
param_bool(ID::ARST_POLARITY);
|
||||||
|
param_bits(ID::ARST_VALUE, param(ID::WIDTH));
|
||||||
|
port(ID::EN, 1);
|
||||||
|
port(ID::ARST, 1);
|
||||||
|
port(ID::D, param(ID::WIDTH));
|
||||||
|
port(ID::Q, param(ID::WIDTH));
|
||||||
|
check_expected();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (cell->type == ID($dlatchsr)) {
|
if (cell->type == ID($dlatchsr)) {
|
||||||
param_bool(ID::EN_POLARITY);
|
param_bool(ID::EN_POLARITY);
|
||||||
param_bool(ID::SET_POLARITY);
|
param_bool(ID::SET_POLARITY);
|
||||||
|
@ -1351,49 +1508,69 @@ namespace {
|
||||||
if (cell->type == ID($_MUX8_)) { port(ID::A,1); port(ID::B,1); port(ID::C,1); port(ID::D,1); port(ID::E,1); port(ID::F,1); port(ID::G,1); port(ID::H,1); port(ID::S,1); port(ID::T,1); port(ID::U,1); port(ID::Y,1); check_expected(); return; }
|
if (cell->type == ID($_MUX8_)) { port(ID::A,1); port(ID::B,1); port(ID::C,1); port(ID::D,1); port(ID::E,1); port(ID::F,1); port(ID::G,1); port(ID::H,1); port(ID::S,1); port(ID::T,1); port(ID::U,1); port(ID::Y,1); check_expected(); return; }
|
||||||
if (cell->type == ID($_MUX16_)) { port(ID::A,1); port(ID::B,1); port(ID::C,1); port(ID::D,1); port(ID::E,1); port(ID::F,1); port(ID::G,1); port(ID::H,1); port(ID::I,1); port(ID::J,1); port(ID::K,1); port(ID::L,1); port(ID::M,1); port(ID::N,1); port(ID::O,1); port(ID::P,1); port(ID::S,1); port(ID::T,1); port(ID::U,1); port(ID::V,1); port(ID::Y,1); check_expected(); return; }
|
if (cell->type == ID($_MUX16_)) { port(ID::A,1); port(ID::B,1); port(ID::C,1); port(ID::D,1); port(ID::E,1); port(ID::F,1); port(ID::G,1); port(ID::H,1); port(ID::I,1); port(ID::J,1); port(ID::K,1); port(ID::L,1); port(ID::M,1); port(ID::N,1); port(ID::O,1); port(ID::P,1); port(ID::S,1); port(ID::T,1); port(ID::U,1); port(ID::V,1); port(ID::Y,1); check_expected(); return; }
|
||||||
|
|
||||||
if (cell->type == ID($_SR_NN_)) { port(ID::S,1); port(ID::R,1); port(ID::Q,1); check_expected(); return; }
|
if (cell->type.in(ID($_SR_NN_), ID($_SR_NP_), ID($_SR_PN_), ID($_SR_PP_)))
|
||||||
if (cell->type == ID($_SR_NP_)) { port(ID::S,1); port(ID::R,1); port(ID::Q,1); check_expected(); return; }
|
{ port(ID::S,1); port(ID::R,1); port(ID::Q,1); check_expected(); return; }
|
||||||
if (cell->type == ID($_SR_PN_)) { port(ID::S,1); port(ID::R,1); port(ID::Q,1); check_expected(); return; }
|
|
||||||
if (cell->type == ID($_SR_PP_)) { port(ID::S,1); port(ID::R,1); port(ID::Q,1); check_expected(); return; }
|
|
||||||
|
|
||||||
if (cell->type == ID($_FF_)) { port(ID::D,1); port(ID::Q,1); check_expected(); return; }
|
if (cell->type == ID($_FF_)) { port(ID::D,1); port(ID::Q,1); check_expected(); return; }
|
||||||
if (cell->type == ID($_DFF_N_)) { port(ID::D,1); port(ID::Q,1); port(ID::C,1); check_expected(); return; }
|
|
||||||
if (cell->type == ID($_DFF_P_)) { port(ID::D,1); port(ID::Q,1); port(ID::C,1); check_expected(); return; }
|
|
||||||
|
|
||||||
if (cell->type == ID($_DFFE_NN_)) { port(ID::D,1); port(ID::Q,1); port(ID::C,1); port(ID::E,1); check_expected(); return; }
|
if (cell->type.in(ID($_DFF_N_), ID($_DFF_P_)))
|
||||||
if (cell->type == ID($_DFFE_NP_)) { port(ID::D,1); port(ID::Q,1); port(ID::C,1); port(ID::E,1); check_expected(); return; }
|
{ port(ID::D,1); port(ID::Q,1); port(ID::C,1); check_expected(); return; }
|
||||||
if (cell->type == ID($_DFFE_PN_)) { port(ID::D,1); port(ID::Q,1); port(ID::C,1); port(ID::E,1); check_expected(); return; }
|
|
||||||
if (cell->type == ID($_DFFE_PP_)) { port(ID::D,1); port(ID::Q,1); port(ID::C,1); port(ID::E,1); check_expected(); return; }
|
|
||||||
|
|
||||||
if (cell->type == ID($_DFF_NN0_)) { port(ID::D,1); port(ID::Q,1); port(ID::C,1); port(ID::R,1); check_expected(); return; }
|
if (cell->type.in(ID($_DFFE_NN_), ID($_DFFE_NP_), ID($_DFFE_PN_), ID($_DFFE_PP_)))
|
||||||
if (cell->type == ID($_DFF_NN1_)) { port(ID::D,1); port(ID::Q,1); port(ID::C,1); port(ID::R,1); check_expected(); return; }
|
{ port(ID::D,1); port(ID::Q,1); port(ID::C,1); port(ID::E,1); check_expected(); return; }
|
||||||
if (cell->type == ID($_DFF_NP0_)) { port(ID::D,1); port(ID::Q,1); port(ID::C,1); port(ID::R,1); check_expected(); return; }
|
|
||||||
if (cell->type == ID($_DFF_NP1_)) { port(ID::D,1); port(ID::Q,1); port(ID::C,1); port(ID::R,1); check_expected(); return; }
|
|
||||||
if (cell->type == ID($_DFF_PN0_)) { port(ID::D,1); port(ID::Q,1); port(ID::C,1); port(ID::R,1); check_expected(); return; }
|
|
||||||
if (cell->type == ID($_DFF_PN1_)) { port(ID::D,1); port(ID::Q,1); port(ID::C,1); port(ID::R,1); check_expected(); return; }
|
|
||||||
if (cell->type == ID($_DFF_PP0_)) { port(ID::D,1); port(ID::Q,1); port(ID::C,1); port(ID::R,1); check_expected(); return; }
|
|
||||||
if (cell->type == ID($_DFF_PP1_)) { port(ID::D,1); port(ID::Q,1); port(ID::C,1); port(ID::R,1); check_expected(); return; }
|
|
||||||
|
|
||||||
if (cell->type == ID($_DFFSR_NNN_)) { port(ID::C,1); port(ID::S,1); port(ID::R,1); port(ID::D,1); port(ID::Q,1); check_expected(); return; }
|
if (cell->type.in(
|
||||||
if (cell->type == ID($_DFFSR_NNP_)) { port(ID::C,1); port(ID::S,1); port(ID::R,1); port(ID::D,1); port(ID::Q,1); check_expected(); return; }
|
ID($_DFF_NN0_), ID($_DFF_NN1_), ID($_DFF_NP0_), ID($_DFF_NP1_),
|
||||||
if (cell->type == ID($_DFFSR_NPN_)) { port(ID::C,1); port(ID::S,1); port(ID::R,1); port(ID::D,1); port(ID::Q,1); check_expected(); return; }
|
ID($_DFF_PN0_), ID($_DFF_PN1_), ID($_DFF_PP0_), ID($_DFF_PP1_)))
|
||||||
if (cell->type == ID($_DFFSR_NPP_)) { port(ID::C,1); port(ID::S,1); port(ID::R,1); port(ID::D,1); port(ID::Q,1); check_expected(); return; }
|
{ port(ID::D,1); port(ID::Q,1); port(ID::C,1); port(ID::R,1); check_expected(); return; }
|
||||||
if (cell->type == ID($_DFFSR_PNN_)) { port(ID::C,1); port(ID::S,1); port(ID::R,1); port(ID::D,1); port(ID::Q,1); check_expected(); return; }
|
|
||||||
if (cell->type == ID($_DFFSR_PNP_)) { port(ID::C,1); port(ID::S,1); port(ID::R,1); port(ID::D,1); port(ID::Q,1); check_expected(); return; }
|
|
||||||
if (cell->type == ID($_DFFSR_PPN_)) { port(ID::C,1); port(ID::S,1); port(ID::R,1); port(ID::D,1); port(ID::Q,1); check_expected(); return; }
|
|
||||||
if (cell->type == ID($_DFFSR_PPP_)) { port(ID::C,1); port(ID::S,1); port(ID::R,1); port(ID::D,1); port(ID::Q,1); check_expected(); return; }
|
|
||||||
|
|
||||||
if (cell->type == ID($_DLATCH_N_)) { port(ID::E,1); port(ID::D,1); port(ID::Q,1); check_expected(); return; }
|
if (cell->type.in(
|
||||||
if (cell->type == ID($_DLATCH_P_)) { port(ID::E,1); port(ID::D,1); port(ID::Q,1); check_expected(); return; }
|
ID($_DFFE_NN0N_), ID($_DFFE_NN0P_), ID($_DFFE_NN1N_), ID($_DFFE_NN1P_),
|
||||||
|
ID($_DFFE_NP0N_), ID($_DFFE_NP0P_), ID($_DFFE_NP1N_), ID($_DFFE_NP1P_),
|
||||||
|
ID($_DFFE_PN0N_), ID($_DFFE_PN0P_), ID($_DFFE_PN1N_), ID($_DFFE_PN1P_),
|
||||||
|
ID($_DFFE_PP0N_), ID($_DFFE_PP0P_), ID($_DFFE_PP1N_), ID($_DFFE_PP1P_)))
|
||||||
|
{ port(ID::D,1); port(ID::Q,1); port(ID::C,1); port(ID::R,1); port(ID::E,1); check_expected(); return; }
|
||||||
|
|
||||||
if (cell->type == ID($_DLATCHSR_NNN_)) { port(ID::E,1); port(ID::S,1); port(ID::R,1); port(ID::D,1); port(ID::Q,1); check_expected(); return; }
|
if (cell->type.in(
|
||||||
if (cell->type == ID($_DLATCHSR_NNP_)) { port(ID::E,1); port(ID::S,1); port(ID::R,1); port(ID::D,1); port(ID::Q,1); check_expected(); return; }
|
ID($_DFFSR_NNN_), ID($_DFFSR_NNP_), ID($_DFFSR_NPN_), ID($_DFFSR_NPP_),
|
||||||
if (cell->type == ID($_DLATCHSR_NPN_)) { port(ID::E,1); port(ID::S,1); port(ID::R,1); port(ID::D,1); port(ID::Q,1); check_expected(); return; }
|
ID($_DFFSR_PNN_), ID($_DFFSR_PNP_), ID($_DFFSR_PPN_), ID($_DFFSR_PPP_)))
|
||||||
if (cell->type == ID($_DLATCHSR_NPP_)) { port(ID::E,1); port(ID::S,1); port(ID::R,1); port(ID::D,1); port(ID::Q,1); check_expected(); return; }
|
{ port(ID::C,1); port(ID::S,1); port(ID::R,1); port(ID::D,1); port(ID::Q,1); check_expected(); return; }
|
||||||
if (cell->type == ID($_DLATCHSR_PNN_)) { port(ID::E,1); port(ID::S,1); port(ID::R,1); port(ID::D,1); port(ID::Q,1); check_expected(); return; }
|
|
||||||
if (cell->type == ID($_DLATCHSR_PNP_)) { port(ID::E,1); port(ID::S,1); port(ID::R,1); port(ID::D,1); port(ID::Q,1); check_expected(); return; }
|
if (cell->type.in(
|
||||||
if (cell->type == ID($_DLATCHSR_PPN_)) { port(ID::E,1); port(ID::S,1); port(ID::R,1); port(ID::D,1); port(ID::Q,1); check_expected(); return; }
|
ID($_DFFSRE_NNNN_), ID($_DFFSRE_NNNP_), ID($_DFFSRE_NNPN_), ID($_DFFSRE_NNPP_),
|
||||||
if (cell->type == ID($_DLATCHSR_PPP_)) { port(ID::E,1); port(ID::S,1); port(ID::R,1); port(ID::D,1); port(ID::Q,1); check_expected(); return; }
|
ID($_DFFSRE_NPNN_), ID($_DFFSRE_NPNP_), ID($_DFFSRE_NPPN_), ID($_DFFSRE_NPPP_),
|
||||||
|
ID($_DFFSRE_PNNN_), ID($_DFFSRE_PNNP_), ID($_DFFSRE_PNPN_), ID($_DFFSRE_PNPP_),
|
||||||
|
ID($_DFFSRE_PPNN_), ID($_DFFSRE_PPNP_), ID($_DFFSRE_PPPN_), ID($_DFFSRE_PPPP_)))
|
||||||
|
{ port(ID::C,1); port(ID::S,1); port(ID::R,1); port(ID::D,1); port(ID::E,1); port(ID::Q,1); check_expected(); return; }
|
||||||
|
|
||||||
|
if (cell->type.in(
|
||||||
|
ID($_SDFF_NN0_), ID($_SDFF_NN1_), ID($_SDFF_NP0_), ID($_SDFF_NP1_),
|
||||||
|
ID($_SDFF_PN0_), ID($_SDFF_PN1_), ID($_SDFF_PP0_), ID($_SDFF_PP1_)))
|
||||||
|
{ port(ID::D,1); port(ID::Q,1); port(ID::C,1); port(ID::R,1); check_expected(); return; }
|
||||||
|
|
||||||
|
if (cell->type.in(
|
||||||
|
ID($_SDFFE_NN0N_), ID($_SDFFE_NN0P_), ID($_SDFFE_NN1N_), ID($_SDFFE_NN1P_),
|
||||||
|
ID($_SDFFE_NP0N_), ID($_SDFFE_NP0P_), ID($_SDFFE_NP1N_), ID($_SDFFE_NP1P_),
|
||||||
|
ID($_SDFFE_PN0N_), ID($_SDFFE_PN0P_), ID($_SDFFE_PN1N_), ID($_SDFFE_PN1P_),
|
||||||
|
ID($_SDFFE_PP0N_), ID($_SDFFE_PP0P_), ID($_SDFFE_PP1N_), ID($_SDFFE_PP1P_),
|
||||||
|
ID($_SDFFCE_NN0N_), ID($_SDFFCE_NN0P_), ID($_SDFFCE_NN1N_), ID($_SDFFCE_NN1P_),
|
||||||
|
ID($_SDFFCE_NP0N_), ID($_SDFFCE_NP0P_), ID($_SDFFCE_NP1N_), ID($_SDFFCE_NP1P_),
|
||||||
|
ID($_SDFFCE_PN0N_), ID($_SDFFCE_PN0P_), ID($_SDFFCE_PN1N_), ID($_SDFFCE_PN1P_),
|
||||||
|
ID($_SDFFCE_PP0N_), ID($_SDFFCE_PP0P_), ID($_SDFFCE_PP1N_), ID($_SDFFCE_PP1P_)))
|
||||||
|
{ port(ID::D,1); port(ID::Q,1); port(ID::C,1); port(ID::R,1); port(ID::E,1); check_expected(); return; }
|
||||||
|
|
||||||
|
if (cell->type.in(ID($_DLATCH_N_), ID($_DLATCH_P_)))
|
||||||
|
{ port(ID::E,1); port(ID::D,1); port(ID::Q,1); check_expected(); return; }
|
||||||
|
|
||||||
|
if (cell->type.in(
|
||||||
|
ID($_DLATCH_NN0_), ID($_DLATCH_NN1_), ID($_DLATCH_NP0_), ID($_DLATCH_NP1_),
|
||||||
|
ID($_DLATCH_PN0_), ID($_DLATCH_PN1_), ID($_DLATCH_PP0_), ID($_DLATCH_PP1_)))
|
||||||
|
{ port(ID::E,1); port(ID::R,1); port(ID::D,1); port(ID::Q,1); check_expected(); return; }
|
||||||
|
|
||||||
|
if (cell->type.in(
|
||||||
|
ID($_DLATCHSR_NNN_), ID($_DLATCHSR_NNP_), ID($_DLATCHSR_NPN_), ID($_DLATCHSR_NPP_),
|
||||||
|
ID($_DLATCHSR_PNN_), ID($_DLATCHSR_PNP_), ID($_DLATCHSR_PPN_), ID($_DLATCHSR_PPP_)))
|
||||||
|
{ port(ID::E,1); port(ID::S,1); port(ID::R,1); port(ID::D,1); port(ID::Q,1); check_expected(); return; }
|
||||||
|
|
||||||
error(__LINE__);
|
error(__LINE__);
|
||||||
}
|
}
|
||||||
|
@ -2299,6 +2476,25 @@ RTLIL::Cell* RTLIL::Module::addDffsr(RTLIL::IdString name, const RTLIL::SigSpec
|
||||||
return cell;
|
return cell;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RTLIL::Cell* RTLIL::Module::addDffsre(RTLIL::IdString name, const RTLIL::SigSpec &sig_clk, const RTLIL::SigSpec &sig_en, const RTLIL::SigSpec &sig_set, const RTLIL::SigSpec &sig_clr,
|
||||||
|
RTLIL::SigSpec sig_d, const RTLIL::SigSpec &sig_q, bool clk_polarity, bool en_polarity, bool set_polarity, bool clr_polarity, const std::string &src)
|
||||||
|
{
|
||||||
|
RTLIL::Cell *cell = addCell(name, ID($dffsre));
|
||||||
|
cell->parameters[ID::CLK_POLARITY] = clk_polarity;
|
||||||
|
cell->parameters[ID::EN_POLARITY] = en_polarity;
|
||||||
|
cell->parameters[ID::SET_POLARITY] = set_polarity;
|
||||||
|
cell->parameters[ID::CLR_POLARITY] = clr_polarity;
|
||||||
|
cell->parameters[ID::WIDTH] = sig_q.size();
|
||||||
|
cell->setPort(ID::CLK, sig_clk);
|
||||||
|
cell->setPort(ID::EN, sig_en);
|
||||||
|
cell->setPort(ID::SET, sig_set);
|
||||||
|
cell->setPort(ID::CLR, sig_clr);
|
||||||
|
cell->setPort(ID::D, sig_d);
|
||||||
|
cell->setPort(ID::Q, sig_q);
|
||||||
|
cell->set_src_attribute(src);
|
||||||
|
return cell;
|
||||||
|
}
|
||||||
|
|
||||||
RTLIL::Cell* RTLIL::Module::addAdff(RTLIL::IdString name, const RTLIL::SigSpec &sig_clk, const RTLIL::SigSpec &sig_arst, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q,
|
RTLIL::Cell* RTLIL::Module::addAdff(RTLIL::IdString name, const RTLIL::SigSpec &sig_clk, const RTLIL::SigSpec &sig_arst, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q,
|
||||||
RTLIL::Const arst_value, bool clk_polarity, bool arst_polarity, const std::string &src)
|
RTLIL::Const arst_value, bool clk_polarity, bool arst_polarity, const std::string &src)
|
||||||
{
|
{
|
||||||
|
@ -2315,6 +2511,76 @@ RTLIL::Cell* RTLIL::Module::addAdff(RTLIL::IdString name, const RTLIL::SigSpec &
|
||||||
return cell;
|
return cell;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RTLIL::Cell* RTLIL::Module::addAdffe(RTLIL::IdString name, const RTLIL::SigSpec &sig_clk, const RTLIL::SigSpec &sig_en, const RTLIL::SigSpec &sig_arst, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q,
|
||||||
|
RTLIL::Const arst_value, bool clk_polarity, bool en_polarity, bool arst_polarity, const std::string &src)
|
||||||
|
{
|
||||||
|
RTLIL::Cell *cell = addCell(name, ID($adffe));
|
||||||
|
cell->parameters[ID::CLK_POLARITY] = clk_polarity;
|
||||||
|
cell->parameters[ID::EN_POLARITY] = en_polarity;
|
||||||
|
cell->parameters[ID::ARST_POLARITY] = arst_polarity;
|
||||||
|
cell->parameters[ID::ARST_VALUE] = arst_value;
|
||||||
|
cell->parameters[ID::WIDTH] = sig_q.size();
|
||||||
|
cell->setPort(ID::CLK, sig_clk);
|
||||||
|
cell->setPort(ID::EN, sig_en);
|
||||||
|
cell->setPort(ID::ARST, sig_arst);
|
||||||
|
cell->setPort(ID::D, sig_d);
|
||||||
|
cell->setPort(ID::Q, sig_q);
|
||||||
|
cell->set_src_attribute(src);
|
||||||
|
return cell;
|
||||||
|
}
|
||||||
|
|
||||||
|
RTLIL::Cell* RTLIL::Module::addSdff(RTLIL::IdString name, const RTLIL::SigSpec &sig_clk, const RTLIL::SigSpec &sig_srst, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q,
|
||||||
|
RTLIL::Const srst_value, bool clk_polarity, bool srst_polarity, const std::string &src)
|
||||||
|
{
|
||||||
|
RTLIL::Cell *cell = addCell(name, ID($sdff));
|
||||||
|
cell->parameters[ID::CLK_POLARITY] = clk_polarity;
|
||||||
|
cell->parameters[ID::SRST_POLARITY] = srst_polarity;
|
||||||
|
cell->parameters[ID::SRST_VALUE] = srst_value;
|
||||||
|
cell->parameters[ID::WIDTH] = sig_q.size();
|
||||||
|
cell->setPort(ID::CLK, sig_clk);
|
||||||
|
cell->setPort(ID::SRST, sig_srst);
|
||||||
|
cell->setPort(ID::D, sig_d);
|
||||||
|
cell->setPort(ID::Q, sig_q);
|
||||||
|
cell->set_src_attribute(src);
|
||||||
|
return cell;
|
||||||
|
}
|
||||||
|
|
||||||
|
RTLIL::Cell* RTLIL::Module::addSdffe(RTLIL::IdString name, const RTLIL::SigSpec &sig_clk, const RTLIL::SigSpec &sig_en, const RTLIL::SigSpec &sig_srst, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q,
|
||||||
|
RTLIL::Const srst_value, bool clk_polarity, bool en_polarity, bool srst_polarity, const std::string &src)
|
||||||
|
{
|
||||||
|
RTLIL::Cell *cell = addCell(name, ID($sdffe));
|
||||||
|
cell->parameters[ID::CLK_POLARITY] = clk_polarity;
|
||||||
|
cell->parameters[ID::EN_POLARITY] = en_polarity;
|
||||||
|
cell->parameters[ID::SRST_POLARITY] = srst_polarity;
|
||||||
|
cell->parameters[ID::SRST_VALUE] = srst_value;
|
||||||
|
cell->parameters[ID::WIDTH] = sig_q.size();
|
||||||
|
cell->setPort(ID::CLK, sig_clk);
|
||||||
|
cell->setPort(ID::EN, sig_en);
|
||||||
|
cell->setPort(ID::SRST, sig_srst);
|
||||||
|
cell->setPort(ID::D, sig_d);
|
||||||
|
cell->setPort(ID::Q, sig_q);
|
||||||
|
cell->set_src_attribute(src);
|
||||||
|
return cell;
|
||||||
|
}
|
||||||
|
|
||||||
|
RTLIL::Cell* RTLIL::Module::addSdffce(RTLIL::IdString name, const RTLIL::SigSpec &sig_clk, const RTLIL::SigSpec &sig_en, const RTLIL::SigSpec &sig_srst, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q,
|
||||||
|
RTLIL::Const srst_value, bool clk_polarity, bool en_polarity, bool srst_polarity, const std::string &src)
|
||||||
|
{
|
||||||
|
RTLIL::Cell *cell = addCell(name, ID($sdffce));
|
||||||
|
cell->parameters[ID::CLK_POLARITY] = clk_polarity;
|
||||||
|
cell->parameters[ID::EN_POLARITY] = en_polarity;
|
||||||
|
cell->parameters[ID::SRST_POLARITY] = srst_polarity;
|
||||||
|
cell->parameters[ID::SRST_VALUE] = srst_value;
|
||||||
|
cell->parameters[ID::WIDTH] = sig_q.size();
|
||||||
|
cell->setPort(ID::CLK, sig_clk);
|
||||||
|
cell->setPort(ID::EN, sig_en);
|
||||||
|
cell->setPort(ID::SRST, sig_srst);
|
||||||
|
cell->setPort(ID::D, sig_d);
|
||||||
|
cell->setPort(ID::Q, sig_q);
|
||||||
|
cell->set_src_attribute(src);
|
||||||
|
return cell;
|
||||||
|
}
|
||||||
|
|
||||||
RTLIL::Cell* RTLIL::Module::addDlatch(RTLIL::IdString name, const RTLIL::SigSpec &sig_en, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q, bool en_polarity, const std::string &src)
|
RTLIL::Cell* RTLIL::Module::addDlatch(RTLIL::IdString name, const RTLIL::SigSpec &sig_en, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q, bool en_polarity, const std::string &src)
|
||||||
{
|
{
|
||||||
RTLIL::Cell *cell = addCell(name, ID($dlatch));
|
RTLIL::Cell *cell = addCell(name, ID($dlatch));
|
||||||
|
@ -2327,6 +2593,22 @@ RTLIL::Cell* RTLIL::Module::addDlatch(RTLIL::IdString name, const RTLIL::SigSpec
|
||||||
return cell;
|
return cell;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RTLIL::Cell* RTLIL::Module::addAdlatch(RTLIL::IdString name, const RTLIL::SigSpec &sig_en, const RTLIL::SigSpec &sig_arst, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q,
|
||||||
|
RTLIL::Const arst_value, bool en_polarity, bool arst_polarity, const std::string &src)
|
||||||
|
{
|
||||||
|
RTLIL::Cell *cell = addCell(name, ID($adlatch));
|
||||||
|
cell->parameters[ID::EN_POLARITY] = en_polarity;
|
||||||
|
cell->parameters[ID::ARST_POLARITY] = arst_polarity;
|
||||||
|
cell->parameters[ID::ARST_VALUE] = arst_value;
|
||||||
|
cell->parameters[ID::WIDTH] = sig_q.size();
|
||||||
|
cell->setPort(ID::EN, sig_en);
|
||||||
|
cell->setPort(ID::ARST, sig_arst);
|
||||||
|
cell->setPort(ID::D, sig_d);
|
||||||
|
cell->setPort(ID::Q, sig_q);
|
||||||
|
cell->set_src_attribute(src);
|
||||||
|
return cell;
|
||||||
|
}
|
||||||
|
|
||||||
RTLIL::Cell* RTLIL::Module::addDlatchsr(RTLIL::IdString name, const RTLIL::SigSpec &sig_en, const RTLIL::SigSpec &sig_set, const RTLIL::SigSpec &sig_clr,
|
RTLIL::Cell* RTLIL::Module::addDlatchsr(RTLIL::IdString name, const RTLIL::SigSpec &sig_en, const RTLIL::SigSpec &sig_set, const RTLIL::SigSpec &sig_clr,
|
||||||
RTLIL::SigSpec sig_d, const RTLIL::SigSpec &sig_q, bool en_polarity, bool set_polarity, bool clr_polarity, const std::string &src)
|
RTLIL::SigSpec sig_d, const RTLIL::SigSpec &sig_q, bool en_polarity, bool set_polarity, bool clr_polarity, const std::string &src)
|
||||||
{
|
{
|
||||||
|
@ -2344,6 +2626,17 @@ RTLIL::Cell* RTLIL::Module::addDlatchsr(RTLIL::IdString name, const RTLIL::SigSp
|
||||||
return cell;
|
return cell;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RTLIL::Cell* RTLIL::Module::addSrGate(RTLIL::IdString name, const RTLIL::SigSpec &sig_set, const RTLIL::SigSpec &sig_clr,
|
||||||
|
const RTLIL::SigSpec &sig_q, bool set_polarity, bool clr_polarity, const std::string &src)
|
||||||
|
{
|
||||||
|
RTLIL::Cell *cell = addCell(name, stringf("$_SR_%c%c_", set_polarity ? 'P' : 'N', clr_polarity ? 'P' : 'N'));
|
||||||
|
cell->setPort(ID::S, sig_set);
|
||||||
|
cell->setPort(ID::R, sig_clr);
|
||||||
|
cell->setPort(ID::Q, sig_q);
|
||||||
|
cell->set_src_attribute(src);
|
||||||
|
return cell;
|
||||||
|
}
|
||||||
|
|
||||||
RTLIL::Cell* RTLIL::Module::addFfGate(RTLIL::IdString name, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q, const std::string &src)
|
RTLIL::Cell* RTLIL::Module::addFfGate(RTLIL::IdString name, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q, const std::string &src)
|
||||||
{
|
{
|
||||||
RTLIL::Cell *cell = addCell(name, ID($_FF_));
|
RTLIL::Cell *cell = addCell(name, ID($_FF_));
|
||||||
|
@ -2387,6 +2680,20 @@ RTLIL::Cell* RTLIL::Module::addDffsrGate(RTLIL::IdString name, const RTLIL::SigS
|
||||||
return cell;
|
return cell;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RTLIL::Cell* RTLIL::Module::addDffsreGate(RTLIL::IdString name, const RTLIL::SigSpec &sig_clk, const RTLIL::SigSpec &sig_en, const RTLIL::SigSpec &sig_set, const RTLIL::SigSpec &sig_clr,
|
||||||
|
RTLIL::SigSpec sig_d, const RTLIL::SigSpec &sig_q, bool clk_polarity, bool en_polarity, bool set_polarity, bool clr_polarity, const std::string &src)
|
||||||
|
{
|
||||||
|
RTLIL::Cell *cell = addCell(name, stringf("$_DFFSRE_%c%c%c%c_", clk_polarity ? 'P' : 'N', set_polarity ? 'P' : 'N', clr_polarity ? 'P' : 'N', en_polarity ? 'P' : 'N'));
|
||||||
|
cell->setPort(ID::C, sig_clk);
|
||||||
|
cell->setPort(ID::S, sig_set);
|
||||||
|
cell->setPort(ID::R, sig_clr);
|
||||||
|
cell->setPort(ID::E, sig_en);
|
||||||
|
cell->setPort(ID::D, sig_d);
|
||||||
|
cell->setPort(ID::Q, sig_q);
|
||||||
|
cell->set_src_attribute(src);
|
||||||
|
return cell;
|
||||||
|
}
|
||||||
|
|
||||||
RTLIL::Cell* RTLIL::Module::addAdffGate(RTLIL::IdString name, const RTLIL::SigSpec &sig_clk, const RTLIL::SigSpec &sig_arst, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q,
|
RTLIL::Cell* RTLIL::Module::addAdffGate(RTLIL::IdString name, const RTLIL::SigSpec &sig_clk, const RTLIL::SigSpec &sig_arst, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q,
|
||||||
bool arst_value, bool clk_polarity, bool arst_polarity, const std::string &src)
|
bool arst_value, bool clk_polarity, bool arst_polarity, const std::string &src)
|
||||||
{
|
{
|
||||||
|
@ -2399,6 +2706,57 @@ RTLIL::Cell* RTLIL::Module::addAdffGate(RTLIL::IdString name, const RTLIL::SigSp
|
||||||
return cell;
|
return cell;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RTLIL::Cell* RTLIL::Module::addAdffeGate(RTLIL::IdString name, const RTLIL::SigSpec &sig_clk, const RTLIL::SigSpec &sig_en, const RTLIL::SigSpec &sig_arst, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q,
|
||||||
|
bool arst_value, bool clk_polarity, bool en_polarity, bool arst_polarity, const std::string &src)
|
||||||
|
{
|
||||||
|
RTLIL::Cell *cell = addCell(name, stringf("$_DFFE_%c%c%c%c_", clk_polarity ? 'P' : 'N', arst_polarity ? 'P' : 'N', arst_value ? '1' : '0', en_polarity ? 'P' : 'N'));
|
||||||
|
cell->setPort(ID::C, sig_clk);
|
||||||
|
cell->setPort(ID::R, sig_arst);
|
||||||
|
cell->setPort(ID::E, sig_en);
|
||||||
|
cell->setPort(ID::D, sig_d);
|
||||||
|
cell->setPort(ID::Q, sig_q);
|
||||||
|
cell->set_src_attribute(src);
|
||||||
|
return cell;
|
||||||
|
}
|
||||||
|
|
||||||
|
RTLIL::Cell* RTLIL::Module::addSdffGate(RTLIL::IdString name, const RTLIL::SigSpec &sig_clk, const RTLIL::SigSpec &sig_srst, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q,
|
||||||
|
bool srst_value, bool clk_polarity, bool srst_polarity, const std::string &src)
|
||||||
|
{
|
||||||
|
RTLIL::Cell *cell = addCell(name, stringf("$_SDFF_%c%c%c_", clk_polarity ? 'P' : 'N', srst_polarity ? 'P' : 'N', srst_value ? '1' : '0'));
|
||||||
|
cell->setPort(ID::C, sig_clk);
|
||||||
|
cell->setPort(ID::R, sig_srst);
|
||||||
|
cell->setPort(ID::D, sig_d);
|
||||||
|
cell->setPort(ID::Q, sig_q);
|
||||||
|
cell->set_src_attribute(src);
|
||||||
|
return cell;
|
||||||
|
}
|
||||||
|
|
||||||
|
RTLIL::Cell* RTLIL::Module::addSdffeGate(RTLIL::IdString name, const RTLIL::SigSpec &sig_clk, const RTLIL::SigSpec &sig_en, const RTLIL::SigSpec &sig_srst, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q,
|
||||||
|
bool srst_value, bool clk_polarity, bool en_polarity, bool srst_polarity, const std::string &src)
|
||||||
|
{
|
||||||
|
RTLIL::Cell *cell = addCell(name, stringf("$_SDFFE_%c%c%c%c_", clk_polarity ? 'P' : 'N', srst_polarity ? 'P' : 'N', srst_value ? '1' : '0', en_polarity ? 'P' : 'N'));
|
||||||
|
cell->setPort(ID::C, sig_clk);
|
||||||
|
cell->setPort(ID::R, sig_srst);
|
||||||
|
cell->setPort(ID::E, sig_en);
|
||||||
|
cell->setPort(ID::D, sig_d);
|
||||||
|
cell->setPort(ID::Q, sig_q);
|
||||||
|
cell->set_src_attribute(src);
|
||||||
|
return cell;
|
||||||
|
}
|
||||||
|
|
||||||
|
RTLIL::Cell* RTLIL::Module::addSdffceGate(RTLIL::IdString name, const RTLIL::SigSpec &sig_clk, const RTLIL::SigSpec &sig_en, const RTLIL::SigSpec &sig_srst, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q,
|
||||||
|
bool srst_value, bool clk_polarity, bool en_polarity, bool srst_polarity, const std::string &src)
|
||||||
|
{
|
||||||
|
RTLIL::Cell *cell = addCell(name, stringf("$_SDFFCE_%c%c%c%c_", clk_polarity ? 'P' : 'N', srst_polarity ? 'P' : 'N', srst_value ? '1' : '0', en_polarity ? 'P' : 'N'));
|
||||||
|
cell->setPort(ID::C, sig_clk);
|
||||||
|
cell->setPort(ID::R, sig_srst);
|
||||||
|
cell->setPort(ID::E, sig_en);
|
||||||
|
cell->setPort(ID::D, sig_d);
|
||||||
|
cell->setPort(ID::Q, sig_q);
|
||||||
|
cell->set_src_attribute(src);
|
||||||
|
return cell;
|
||||||
|
}
|
||||||
|
|
||||||
RTLIL::Cell* RTLIL::Module::addDlatchGate(RTLIL::IdString name, const RTLIL::SigSpec &sig_en, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q, bool en_polarity, const std::string &src)
|
RTLIL::Cell* RTLIL::Module::addDlatchGate(RTLIL::IdString name, const RTLIL::SigSpec &sig_en, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q, bool en_polarity, const std::string &src)
|
||||||
{
|
{
|
||||||
RTLIL::Cell *cell = addCell(name, stringf("$_DLATCH_%c_", en_polarity ? 'P' : 'N'));
|
RTLIL::Cell *cell = addCell(name, stringf("$_DLATCH_%c_", en_polarity ? 'P' : 'N'));
|
||||||
|
@ -2409,6 +2767,18 @@ RTLIL::Cell* RTLIL::Module::addDlatchGate(RTLIL::IdString name, const RTLIL::Sig
|
||||||
return cell;
|
return cell;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RTLIL::Cell* RTLIL::Module::addAdlatchGate(RTLIL::IdString name, const RTLIL::SigSpec &sig_en, const RTLIL::SigSpec &sig_arst, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q,
|
||||||
|
bool arst_value, bool en_polarity, bool arst_polarity, const std::string &src)
|
||||||
|
{
|
||||||
|
RTLIL::Cell *cell = addCell(name, stringf("$_DLATCH_%c%c%c_", en_polarity ? 'P' : 'N', arst_polarity ? 'P' : 'N', arst_value ? '1' : '0'));
|
||||||
|
cell->setPort(ID::E, sig_en);
|
||||||
|
cell->setPort(ID::R, sig_arst);
|
||||||
|
cell->setPort(ID::D, sig_d);
|
||||||
|
cell->setPort(ID::Q, sig_q);
|
||||||
|
cell->set_src_attribute(src);
|
||||||
|
return cell;
|
||||||
|
}
|
||||||
|
|
||||||
RTLIL::Cell* RTLIL::Module::addDlatchsrGate(RTLIL::IdString name, const RTLIL::SigSpec &sig_en, const RTLIL::SigSpec &sig_set, const RTLIL::SigSpec &sig_clr,
|
RTLIL::Cell* RTLIL::Module::addDlatchsrGate(RTLIL::IdString name, const RTLIL::SigSpec &sig_en, const RTLIL::SigSpec &sig_set, const RTLIL::SigSpec &sig_clr,
|
||||||
RTLIL::SigSpec sig_d, const RTLIL::SigSpec &sig_q, bool en_polarity, bool set_polarity, bool clr_polarity, const std::string &src)
|
RTLIL::SigSpec sig_d, const RTLIL::SigSpec &sig_q, bool en_polarity, bool set_polarity, bool clr_polarity, const std::string &src)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1274,8 +1274,14 @@ public:
|
||||||
RTLIL::Cell* addDff (RTLIL::IdString name, const RTLIL::SigSpec &sig_clk, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q, bool clk_polarity = true, const std::string &src = "");
|
RTLIL::Cell* addDff (RTLIL::IdString name, const RTLIL::SigSpec &sig_clk, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q, bool clk_polarity = true, const std::string &src = "");
|
||||||
RTLIL::Cell* addDffe (RTLIL::IdString name, const RTLIL::SigSpec &sig_clk, const RTLIL::SigSpec &sig_en, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q, bool clk_polarity = true, bool en_polarity = true, const std::string &src = "");
|
RTLIL::Cell* addDffe (RTLIL::IdString name, const RTLIL::SigSpec &sig_clk, const RTLIL::SigSpec &sig_en, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q, bool clk_polarity = true, bool en_polarity = true, const std::string &src = "");
|
||||||
RTLIL::Cell* addDffsr (RTLIL::IdString name, const RTLIL::SigSpec &sig_clk, const RTLIL::SigSpec &sig_set, const RTLIL::SigSpec &sig_clr, RTLIL::SigSpec sig_d, const RTLIL::SigSpec &sig_q, bool clk_polarity = true, bool set_polarity = true, bool clr_polarity = true, const std::string &src = "");
|
RTLIL::Cell* addDffsr (RTLIL::IdString name, const RTLIL::SigSpec &sig_clk, const RTLIL::SigSpec &sig_set, const RTLIL::SigSpec &sig_clr, RTLIL::SigSpec sig_d, const RTLIL::SigSpec &sig_q, bool clk_polarity = true, bool set_polarity = true, bool clr_polarity = true, const std::string &src = "");
|
||||||
|
RTLIL::Cell* addDffsre (RTLIL::IdString name, const RTLIL::SigSpec &sig_clk, const RTLIL::SigSpec &sig_en, const RTLIL::SigSpec &sig_set, const RTLIL::SigSpec &sig_clr, RTLIL::SigSpec sig_d, const RTLIL::SigSpec &sig_q, bool clk_polarity = true, bool en_polarity = true, bool set_polarity = true, bool clr_polarity = true, const std::string &src = "");
|
||||||
RTLIL::Cell* addAdff (RTLIL::IdString name, const RTLIL::SigSpec &sig_clk, const RTLIL::SigSpec &sig_arst, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q, RTLIL::Const arst_value, bool clk_polarity = true, bool arst_polarity = true, const std::string &src = "");
|
RTLIL::Cell* addAdff (RTLIL::IdString name, const RTLIL::SigSpec &sig_clk, const RTLIL::SigSpec &sig_arst, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q, RTLIL::Const arst_value, bool clk_polarity = true, bool arst_polarity = true, const std::string &src = "");
|
||||||
|
RTLIL::Cell* addAdffe (RTLIL::IdString name, const RTLIL::SigSpec &sig_clk, const RTLIL::SigSpec &sig_en, const RTLIL::SigSpec &sig_arst, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q, RTLIL::Const arst_value, bool clk_polarity = true, bool en_polarity = true, bool arst_polarity = true, const std::string &src = "");
|
||||||
|
RTLIL::Cell* addSdff (RTLIL::IdString name, const RTLIL::SigSpec &sig_clk, const RTLIL::SigSpec &sig_srst, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q, RTLIL::Const srst_value, bool clk_polarity = true, bool srst_polarity = true, const std::string &src = "");
|
||||||
|
RTLIL::Cell* addSdffe (RTLIL::IdString name, const RTLIL::SigSpec &sig_clk, const RTLIL::SigSpec &sig_en, const RTLIL::SigSpec &sig_srst, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q, RTLIL::Const srst_value, bool clk_polarity = true, bool en_polarity = true, bool srst_polarity = true, const std::string &src = "");
|
||||||
|
RTLIL::Cell* addSdffce (RTLIL::IdString name, const RTLIL::SigSpec &sig_clk, const RTLIL::SigSpec &sig_en, const RTLIL::SigSpec &sig_srst, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q, RTLIL::Const srst_value, bool clk_polarity = true, bool en_polarity = true, bool srst_polarity = true, const std::string &src = "");
|
||||||
RTLIL::Cell* addDlatch (RTLIL::IdString name, const RTLIL::SigSpec &sig_en, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q, bool en_polarity = true, const std::string &src = "");
|
RTLIL::Cell* addDlatch (RTLIL::IdString name, const RTLIL::SigSpec &sig_en, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q, bool en_polarity = true, const std::string &src = "");
|
||||||
|
RTLIL::Cell* addAdlatch (RTLIL::IdString name, const RTLIL::SigSpec &sig_en, const RTLIL::SigSpec &sig_arst, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q, RTLIL::Const arst_value, bool en_polarity = true, bool arst_polarity = true, const std::string &src = "");
|
||||||
RTLIL::Cell* addDlatchsr (RTLIL::IdString name, const RTLIL::SigSpec &sig_en, const RTLIL::SigSpec &sig_set, const RTLIL::SigSpec &sig_clr, RTLIL::SigSpec sig_d, const RTLIL::SigSpec &sig_q, bool en_polarity = true, bool set_polarity = true, bool clr_polarity = true, const std::string &src = "");
|
RTLIL::Cell* addDlatchsr (RTLIL::IdString name, const RTLIL::SigSpec &sig_en, const RTLIL::SigSpec &sig_set, const RTLIL::SigSpec &sig_clr, RTLIL::SigSpec sig_d, const RTLIL::SigSpec &sig_q, bool en_polarity = true, bool set_polarity = true, bool clr_polarity = true, const std::string &src = "");
|
||||||
|
|
||||||
RTLIL::Cell* addBufGate (RTLIL::IdString name, const RTLIL::SigBit &sig_a, const RTLIL::SigBit &sig_y, const std::string &src = "");
|
RTLIL::Cell* addBufGate (RTLIL::IdString name, const RTLIL::SigBit &sig_a, const RTLIL::SigBit &sig_y, const std::string &src = "");
|
||||||
|
@ -1295,14 +1301,28 @@ public:
|
||||||
RTLIL::Cell* addAoi4Gate (RTLIL::IdString name, const RTLIL::SigBit &sig_a, const RTLIL::SigBit &sig_b, const RTLIL::SigBit &sig_c, const RTLIL::SigBit &sig_d, const RTLIL::SigBit &sig_y, const std::string &src = "");
|
RTLIL::Cell* addAoi4Gate (RTLIL::IdString name, const RTLIL::SigBit &sig_a, const RTLIL::SigBit &sig_b, const RTLIL::SigBit &sig_c, const RTLIL::SigBit &sig_d, const RTLIL::SigBit &sig_y, const std::string &src = "");
|
||||||
RTLIL::Cell* addOai4Gate (RTLIL::IdString name, const RTLIL::SigBit &sig_a, const RTLIL::SigBit &sig_b, const RTLIL::SigBit &sig_c, const RTLIL::SigBit &sig_d, const RTLIL::SigBit &sig_y, const std::string &src = "");
|
RTLIL::Cell* addOai4Gate (RTLIL::IdString name, const RTLIL::SigBit &sig_a, const RTLIL::SigBit &sig_b, const RTLIL::SigBit &sig_c, const RTLIL::SigBit &sig_d, const RTLIL::SigBit &sig_y, const std::string &src = "");
|
||||||
|
|
||||||
|
RTLIL::Cell* addSrGate (RTLIL::IdString name, const RTLIL::SigSpec &sig_set, const RTLIL::SigSpec &sig_clr,
|
||||||
|
const RTLIL::SigSpec &sig_q, bool set_polarity = true, bool clr_polarity = true, const std::string &src = "");
|
||||||
RTLIL::Cell* addFfGate (RTLIL::IdString name, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q, const std::string &src = "");
|
RTLIL::Cell* addFfGate (RTLIL::IdString name, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q, const std::string &src = "");
|
||||||
RTLIL::Cell* addDffGate (RTLIL::IdString name, const RTLIL::SigSpec &sig_clk, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q, bool clk_polarity = true, const std::string &src = "");
|
RTLIL::Cell* addDffGate (RTLIL::IdString name, const RTLIL::SigSpec &sig_clk, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q, bool clk_polarity = true, const std::string &src = "");
|
||||||
RTLIL::Cell* addDffeGate (RTLIL::IdString name, const RTLIL::SigSpec &sig_clk, const RTLIL::SigSpec &sig_en, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q, bool clk_polarity = true, bool en_polarity = true, const std::string &src = "");
|
RTLIL::Cell* addDffeGate (RTLIL::IdString name, const RTLIL::SigSpec &sig_clk, const RTLIL::SigSpec &sig_en, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q, bool clk_polarity = true, bool en_polarity = true, const std::string &src = "");
|
||||||
RTLIL::Cell* addDffsrGate (RTLIL::IdString name, const RTLIL::SigSpec &sig_clk, const RTLIL::SigSpec &sig_set, const RTLIL::SigSpec &sig_clr,
|
RTLIL::Cell* addDffsrGate (RTLIL::IdString name, const RTLIL::SigSpec &sig_clk, const RTLIL::SigSpec &sig_set, const RTLIL::SigSpec &sig_clr,
|
||||||
RTLIL::SigSpec sig_d, const RTLIL::SigSpec &sig_q, bool clk_polarity = true, bool set_polarity = true, bool clr_polarity = true, const std::string &src = "");
|
RTLIL::SigSpec sig_d, const RTLIL::SigSpec &sig_q, bool clk_polarity = true, bool set_polarity = true, bool clr_polarity = true, const std::string &src = "");
|
||||||
|
RTLIL::Cell* addDffsreGate (RTLIL::IdString name, const RTLIL::SigSpec &sig_clk, const RTLIL::SigSpec &sig_en, const RTLIL::SigSpec &sig_set, const RTLIL::SigSpec &sig_clr,
|
||||||
|
RTLIL::SigSpec sig_d, const RTLIL::SigSpec &sig_q, bool clk_polarity = true, bool en_polarity = true, bool set_polarity = true, bool clr_polarity = true, const std::string &src = "");
|
||||||
RTLIL::Cell* addAdffGate (RTLIL::IdString name, const RTLIL::SigSpec &sig_clk, const RTLIL::SigSpec &sig_arst, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q,
|
RTLIL::Cell* addAdffGate (RTLIL::IdString name, const RTLIL::SigSpec &sig_clk, const RTLIL::SigSpec &sig_arst, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q,
|
||||||
bool arst_value = false, bool clk_polarity = true, bool arst_polarity = true, const std::string &src = "");
|
bool arst_value = false, bool clk_polarity = true, bool arst_polarity = true, const std::string &src = "");
|
||||||
|
RTLIL::Cell* addAdffeGate (RTLIL::IdString name, const RTLIL::SigSpec &sig_clk, const RTLIL::SigSpec &sig_en, const RTLIL::SigSpec &sig_arst, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q,
|
||||||
|
bool arst_value = false, bool clk_polarity = true, bool en_polarity = true, bool arst_polarity = true, const std::string &src = "");
|
||||||
|
RTLIL::Cell* addSdffGate (RTLIL::IdString name, const RTLIL::SigSpec &sig_clk, const RTLIL::SigSpec &sig_srst, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q,
|
||||||
|
bool srst_value = false, bool clk_polarity = true, bool srst_polarity = true, const std::string &src = "");
|
||||||
|
RTLIL::Cell* addSdffeGate (RTLIL::IdString name, const RTLIL::SigSpec &sig_clk, const RTLIL::SigSpec &sig_en, const RTLIL::SigSpec &sig_srst, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q,
|
||||||
|
bool srst_value = false, bool clk_polarity = true, bool en_polarity = true, bool srst_polarity = true, const std::string &src = "");
|
||||||
|
RTLIL::Cell* addSdffceGate (RTLIL::IdString name, const RTLIL::SigSpec &sig_clk, const RTLIL::SigSpec &sig_en, const RTLIL::SigSpec &sig_srst, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q,
|
||||||
|
bool srst_value = false, bool clk_polarity = true, bool en_polarity = true, bool srst_polarity = true, const std::string &src = "");
|
||||||
RTLIL::Cell* addDlatchGate (RTLIL::IdString name, const RTLIL::SigSpec &sig_en, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q, bool en_polarity = true, const std::string &src = "");
|
RTLIL::Cell* addDlatchGate (RTLIL::IdString name, const RTLIL::SigSpec &sig_en, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q, bool en_polarity = true, const std::string &src = "");
|
||||||
|
RTLIL::Cell* addAdlatchGate(RTLIL::IdString name, const RTLIL::SigSpec &sig_en, const RTLIL::SigSpec &sig_arst, const RTLIL::SigSpec &sig_d, const RTLIL::SigSpec &sig_q,
|
||||||
|
bool arst_value = false, bool en_polarity = true, bool arst_polarity = true, const std::string &src = "");
|
||||||
RTLIL::Cell* addDlatchsrGate (RTLIL::IdString name, const RTLIL::SigSpec &sig_en, const RTLIL::SigSpec &sig_set, const RTLIL::SigSpec &sig_clr,
|
RTLIL::Cell* addDlatchsrGate (RTLIL::IdString name, const RTLIL::SigSpec &sig_en, const RTLIL::SigSpec &sig_set, const RTLIL::SigSpec &sig_clr,
|
||||||
RTLIL::SigSpec sig_d, const RTLIL::SigSpec &sig_q, bool en_polarity = true, bool set_polarity = true, bool clr_polarity = true, const std::string &src = "");
|
RTLIL::SigSpec sig_d, const RTLIL::SigSpec &sig_q, bool en_polarity = true, bool set_polarity = true, bool clr_polarity = true, const std::string &src = "");
|
||||||
|
|
||||||
|
|
|
@ -234,16 +234,6 @@ Clock is active on the positive edge if this parameter has the value {\tt 1'b1}
|
||||||
edge if this parameter is {\tt 1'b0}.
|
edge if this parameter is {\tt 1'b0}.
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
D-type flip-flops with enable are represented by {\tt \$dffe} cells. As the {\tt \$dff}
|
|
||||||
cells they have \B{CLK}, \B{D} and \B{Q} ports. In addition they also have a single-bit \B{EN}
|
|
||||||
input port for the enable pin and the following parameter:
|
|
||||||
|
|
||||||
\begin{itemize}
|
|
||||||
\item \B{EN\_POLARITY} \\
|
|
||||||
The enable input is active-high if this parameter has the value {\tt 1'b1} and active-low
|
|
||||||
if this parameter is {\tt 1'b0}.
|
|
||||||
\end{itemize}
|
|
||||||
|
|
||||||
D-type flip-flops with asynchronous reset are represented by {\tt \$adff} cells. As the {\tt \$dff}
|
D-type flip-flops with asynchronous reset are represented by {\tt \$adff} cells. As the {\tt \$dff}
|
||||||
cells they have \B{CLK}, \B{D} and \B{Q} ports. In addition they also have a single-bit \B{ARST}
|
cells they have \B{CLK}, \B{D} and \B{Q} ports. In addition they also have a single-bit \B{ARST}
|
||||||
input port for the reset pin and the following additional two parameters:
|
input port for the reset pin and the following additional two parameters:
|
||||||
|
@ -257,13 +247,26 @@ if this parameter is {\tt 1'b0}.
|
||||||
The state of \B{Q} will be set to this value when the reset is active.
|
The state of \B{Q} will be set to this value when the reset is active.
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
Note that the {\tt \$adff} cell can only be used when the reset value is constant.
|
|
||||||
|
|
||||||
\begin{sloppypar}
|
\begin{sloppypar}
|
||||||
Usually these cells are generated by the {\tt proc} pass using the information
|
Usually these cells are generated by the {\tt proc} pass using the information
|
||||||
in the designs RTLIL::Process objects.
|
in the designs RTLIL::Process objects.
|
||||||
\end{sloppypar}
|
\end{sloppypar}
|
||||||
|
|
||||||
|
D-type flip-flops with synchronous reset are represented by {\tt \$sdff} cells. As the {\tt \$dff}
|
||||||
|
cells they have \B{CLK}, \B{D} and \B{Q} ports. In addition they also have a single-bit \B{SRST}
|
||||||
|
input port for the reset pin and the following additional two parameters:
|
||||||
|
|
||||||
|
\begin{itemize}
|
||||||
|
\item \B{SRST\_POLARITY} \\
|
||||||
|
The synchronous reset is active-high if this parameter has the value {\tt 1'b1} and active-low
|
||||||
|
if this parameter is {\tt 1'b0}.
|
||||||
|
|
||||||
|
\item \B{SRST\_VALUE} \\
|
||||||
|
The state of \B{Q} will be set to this value when the reset is active.
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
Note that the {\tt \$adff} and {\tt \$sdff} cells can only be used when the reset value is constant.
|
||||||
|
|
||||||
D-type flip-flops with asynchronous set and reset are represented by {\tt \$dffsr} cells.
|
D-type flip-flops with asynchronous set and reset are represented by {\tt \$dffsr} cells.
|
||||||
As the {\tt \$dff} cells they have \B{CLK}, \B{D} and \B{Q} ports. In addition they also have
|
As the {\tt \$dff} cells they have \B{CLK}, \B{D} and \B{Q} ports. In addition they also have
|
||||||
a single-bit \B{SET} input port for the set pin, a single-bit \B{CLR} input port for the reset pin,
|
a single-bit \B{SET} input port for the set pin, a single-bit \B{CLR} input port for the reset pin,
|
||||||
|
@ -282,9 +285,21 @@ if this parameter is {\tt 1'b0}.
|
||||||
When both the set and reset inputs of a {\tt \$dffsr} cell are active, the reset input takes
|
When both the set and reset inputs of a {\tt \$dffsr} cell are active, the reset input takes
|
||||||
precedence.
|
precedence.
|
||||||
|
|
||||||
|
D-type flip-flops with enable are represented by {\tt \$dffe}, {\tt \$adffe}, {\tt \$dffsre},
|
||||||
|
{\tt \$sdffe}, and {\tt \$sdffce} cells, which are enhanced variants of {\tt \$dff}, {\tt \$adff}, {\tt \$dffsr},
|
||||||
|
{\tt \$sdff} (with reset over enable) and {\tt \$sdff} (with enable over reset)
|
||||||
|
cells, respectively. They have the same ports and parameters as their base cell.
|
||||||
|
In addition they also have a single-bit \B{EN} input port for the enable pin and the following parameter:
|
||||||
|
|
||||||
|
\begin{itemize}
|
||||||
|
\item \B{EN\_POLARITY} \\
|
||||||
|
The enable input is active-high if this parameter has the value {\tt 1'b1} and active-low
|
||||||
|
if this parameter is {\tt 1'b0}.
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
\begin{fixme}
|
\begin{fixme}
|
||||||
Add information about {\tt \$sr} cells (set-reset flip-flops), {\tt \$dlatch} cells (d-type latches),
|
Add information about {\tt \$sr} cells (set-reset flip-flops), {\tt \$dlatch} cells (d-type latches),
|
||||||
and {\tt \$dlatchsr} cells (d-type latches with set/reset).
|
{\tt \$adlatch} and {\tt \$dlatchsr} cells (d-type latches with set/reset).
|
||||||
\end{fixme}
|
\end{fixme}
|
||||||
|
|
||||||
\subsection{Memories}
|
\subsection{Memories}
|
||||||
|
@ -490,20 +505,29 @@ Verilog & Cell Type \\
|
||||||
\lstinline[language=Verilog]; always @(negedge C) Q <= D; & {\tt \$\_DFF\_N\_} \\
|
\lstinline[language=Verilog]; always @(negedge C) Q <= D; & {\tt \$\_DFF\_N\_} \\
|
||||||
\lstinline[language=Verilog]; always @(posedge C) Q <= D; & {\tt \$\_DFF\_P\_} \\
|
\lstinline[language=Verilog]; always @(posedge C) Q <= D; & {\tt \$\_DFF\_P\_} \\
|
||||||
\end{tabular}
|
\end{tabular}
|
||||||
|
\caption{Cell types for gate level logic networks (main list)}
|
||||||
|
\label{tab:CellLib_gates}
|
||||||
|
\end{table}
|
||||||
|
|
||||||
|
\begin{table}[t]
|
||||||
\hfil
|
\hfil
|
||||||
\begin{tabular}[t]{llll}
|
\begin{tabular}[t]{llll}
|
||||||
$ClkEdge$ & $RstLvl$ & $RstVal$ & Cell Type \\
|
$ClkEdge$ & $RstLvl$ & $RstVal$ & Cell Type \\
|
||||||
\hline
|
\hline
|
||||||
\lstinline[language=Verilog];negedge; & \lstinline[language=Verilog];0; & \lstinline[language=Verilog];0; & {\tt \$\_DFF\_NN0\_} \\
|
\lstinline[language=Verilog];negedge; & \lstinline[language=Verilog];0; & \lstinline[language=Verilog];0; & {\tt \$\_DFF\_NN0\_}, {\tt \$\_SDFF\_NN0\_} \\
|
||||||
\lstinline[language=Verilog];negedge; & \lstinline[language=Verilog];0; & \lstinline[language=Verilog];1; & {\tt \$\_DFF\_NN1\_} \\
|
\lstinline[language=Verilog];negedge; & \lstinline[language=Verilog];0; & \lstinline[language=Verilog];1; & {\tt \$\_DFF\_NN1\_}, {\tt \$\_SDFF\_NN1\_} \\
|
||||||
\lstinline[language=Verilog];negedge; & \lstinline[language=Verilog];1; & \lstinline[language=Verilog];0; & {\tt \$\_DFF\_NP0\_} \\
|
\lstinline[language=Verilog];negedge; & \lstinline[language=Verilog];1; & \lstinline[language=Verilog];0; & {\tt \$\_DFF\_NP0\_}, {\tt \$\_SDFF\_NP0\_} \\
|
||||||
\lstinline[language=Verilog];negedge; & \lstinline[language=Verilog];1; & \lstinline[language=Verilog];1; & {\tt \$\_DFF\_NP1\_} \\
|
\lstinline[language=Verilog];negedge; & \lstinline[language=Verilog];1; & \lstinline[language=Verilog];1; & {\tt \$\_DFF\_NP1\_}, {\tt \$\_SDFF\_NP1\_} \\
|
||||||
\lstinline[language=Verilog];posedge; & \lstinline[language=Verilog];0; & \lstinline[language=Verilog];0; & {\tt \$\_DFF\_PN0\_} \\
|
\lstinline[language=Verilog];posedge; & \lstinline[language=Verilog];0; & \lstinline[language=Verilog];0; & {\tt \$\_DFF\_PN0\_}, {\tt \$\_SDFF\_PN0\_} \\
|
||||||
\lstinline[language=Verilog];posedge; & \lstinline[language=Verilog];0; & \lstinline[language=Verilog];1; & {\tt \$\_DFF\_PN1\_} \\
|
\lstinline[language=Verilog];posedge; & \lstinline[language=Verilog];0; & \lstinline[language=Verilog];1; & {\tt \$\_DFF\_PN1\_}, {\tt \$\_SDFF\_PN1\_} \\
|
||||||
\lstinline[language=Verilog];posedge; & \lstinline[language=Verilog];1; & \lstinline[language=Verilog];0; & {\tt \$\_DFF\_PP0\_} \\
|
\lstinline[language=Verilog];posedge; & \lstinline[language=Verilog];1; & \lstinline[language=Verilog];0; & {\tt \$\_DFF\_PP0\_}, {\tt \$\_SDFF\_PP0\_} \\
|
||||||
\lstinline[language=Verilog];posedge; & \lstinline[language=Verilog];1; & \lstinline[language=Verilog];1; & {\tt \$\_DFF\_PP1\_} \\
|
\lstinline[language=Verilog];posedge; & \lstinline[language=Verilog];1; & \lstinline[language=Verilog];1; & {\tt \$\_DFF\_PP1\_}, {\tt \$\_SDFF\_PP1\_} \\
|
||||||
\end{tabular}
|
\end{tabular}
|
||||||
% FIXME: the layout of this is broken and I have no idea how to fix it
|
\caption{Cell types for gate level logic networks (FFs with reset)}
|
||||||
|
\label{tab:CellLib_gates_adff}
|
||||||
|
\end{table}
|
||||||
|
|
||||||
|
\begin{table}[t]
|
||||||
\hfil
|
\hfil
|
||||||
\begin{tabular}[t]{lll}
|
\begin{tabular}[t]{lll}
|
||||||
$ClkEdge$ & $EnLvl$ & Cell Type \\
|
$ClkEdge$ & $EnLvl$ & Cell Type \\
|
||||||
|
@ -513,7 +537,36 @@ $ClkEdge$ & $EnLvl$ & Cell Type \\
|
||||||
\lstinline[language=Verilog];posedge; & \lstinline[language=Verilog];0; & {\tt \$\_DFFE\_PN\_} \\
|
\lstinline[language=Verilog];posedge; & \lstinline[language=Verilog];0; & {\tt \$\_DFFE\_PN\_} \\
|
||||||
\lstinline[language=Verilog];posedge; & \lstinline[language=Verilog];1; & {\tt \$\_DFFE\_PP\_} \\
|
\lstinline[language=Verilog];posedge; & \lstinline[language=Verilog];1; & {\tt \$\_DFFE\_PP\_} \\
|
||||||
\end{tabular}
|
\end{tabular}
|
||||||
% FIXME: the layout of this is broken too
|
\caption{Cell types for gate level logic networks (FFs with enable)}
|
||||||
|
\label{tab:CellLib_gates_dffe}
|
||||||
|
\end{table}
|
||||||
|
|
||||||
|
\begin{table}[t]
|
||||||
|
\begin{tabular}[t]{lllll}
|
||||||
|
$ClkEdge$ & $RstLvl$ & $RstVal$ & $EnLvl$ & Cell Type \\
|
||||||
|
\hline
|
||||||
|
\lstinline[language=Verilog];negedge; & \lstinline[language=Verilog];0; & \lstinline[language=Verilog];0; & \lstinline[language=Verilog];0; & {\tt \$\_DFFE\_NN0N\_}, {\tt \$\_SDFFE\_NN0N\_}, {\tt \$\_SDFFCE\_NN0N\_} \\
|
||||||
|
\lstinline[language=Verilog];negedge; & \lstinline[language=Verilog];0; & \lstinline[language=Verilog];0; & \lstinline[language=Verilog];1; & {\tt \$\_DFFE\_NN0P\_}, {\tt \$\_SDFFE\_NN0P\_}, {\tt \$\_SDFFCE\_NN0P\_} \\
|
||||||
|
\lstinline[language=Verilog];negedge; & \lstinline[language=Verilog];0; & \lstinline[language=Verilog];1; & \lstinline[language=Verilog];0; & {\tt \$\_DFFE\_NN1N\_}, {\tt \$\_SDFFE\_NN1N\_}, {\tt \$\_SDFFCE\_NN1N\_} \\
|
||||||
|
\lstinline[language=Verilog];negedge; & \lstinline[language=Verilog];0; & \lstinline[language=Verilog];1; & \lstinline[language=Verilog];1; & {\tt \$\_DFFE\_NN1P\_}, {\tt \$\_SDFFE\_NN1P\_}, {\tt \$\_SDFFCE\_NN1P\_} \\
|
||||||
|
\lstinline[language=Verilog];negedge; & \lstinline[language=Verilog];1; & \lstinline[language=Verilog];0; & \lstinline[language=Verilog];0; & {\tt \$\_DFFE\_NP0N\_}, {\tt \$\_SDFFE\_NP0N\_}, {\tt \$\_SDFFCE\_NP0N\_} \\
|
||||||
|
\lstinline[language=Verilog];negedge; & \lstinline[language=Verilog];1; & \lstinline[language=Verilog];0; & \lstinline[language=Verilog];1; & {\tt \$\_DFFE\_NP0P\_}, {\tt \$\_SDFFE\_NP0P\_}, {\tt \$\_SDFFCE\_NP0P\_} \\
|
||||||
|
\lstinline[language=Verilog];negedge; & \lstinline[language=Verilog];1; & \lstinline[language=Verilog];1; & \lstinline[language=Verilog];0; & {\tt \$\_DFFE\_NP1N\_}, {\tt \$\_SDFFE\_NP1N\_}, {\tt \$\_SDFFCE\_NP1N\_} \\
|
||||||
|
\lstinline[language=Verilog];negedge; & \lstinline[language=Verilog];1; & \lstinline[language=Verilog];1; & \lstinline[language=Verilog];1; & {\tt \$\_DFFE\_NP1P\_}, {\tt \$\_SDFFE\_NP1P\_}, {\tt \$\_SDFFCE\_NP1P\_} \\
|
||||||
|
\lstinline[language=Verilog];posedge; & \lstinline[language=Verilog];0; & \lstinline[language=Verilog];0; & \lstinline[language=Verilog];0; & {\tt \$\_DFFE\_PN0N\_}, {\tt \$\_SDFFE\_PN0N\_}, {\tt \$\_SDFFCE\_PN0N\_} \\
|
||||||
|
\lstinline[language=Verilog];posedge; & \lstinline[language=Verilog];0; & \lstinline[language=Verilog];0; & \lstinline[language=Verilog];1; & {\tt \$\_DFFE\_PN0P\_}, {\tt \$\_SDFFE\_PN0P\_}, {\tt \$\_SDFFCE\_PN0P\_} \\
|
||||||
|
\lstinline[language=Verilog];posedge; & \lstinline[language=Verilog];0; & \lstinline[language=Verilog];1; & \lstinline[language=Verilog];0; & {\tt \$\_DFFE\_PN1N\_}, {\tt \$\_SDFFE\_PN1N\_}, {\tt \$\_SDFFCE\_PN1N\_} \\
|
||||||
|
\lstinline[language=Verilog];posedge; & \lstinline[language=Verilog];0; & \lstinline[language=Verilog];1; & \lstinline[language=Verilog];1; & {\tt \$\_DFFE\_PN1P\_}, {\tt \$\_SDFFE\_PN1P\_}, {\tt \$\_SDFFCE\_PN1P\_} \\
|
||||||
|
\lstinline[language=Verilog];posedge; & \lstinline[language=Verilog];1; & \lstinline[language=Verilog];0; & \lstinline[language=Verilog];0; & {\tt \$\_DFFE\_PP0N\_}, {\tt \$\_SDFFE\_PP0N\_}, {\tt \$\_SDFFCE\_PP0N\_} \\
|
||||||
|
\lstinline[language=Verilog];posedge; & \lstinline[language=Verilog];1; & \lstinline[language=Verilog];0; & \lstinline[language=Verilog];1; & {\tt \$\_DFFE\_PP0P\_}, {\tt \$\_SDFFE\_PP0P\_}, {\tt \$\_SDFFCE\_PP0P\_} \\
|
||||||
|
\lstinline[language=Verilog];posedge; & \lstinline[language=Verilog];1; & \lstinline[language=Verilog];1; & \lstinline[language=Verilog];0; & {\tt \$\_DFFE\_PP1N\_}, {\tt \$\_SDFFE\_PP1N\_}, {\tt \$\_SDFFCE\_PP1N\_} \\
|
||||||
|
\lstinline[language=Verilog];posedge; & \lstinline[language=Verilog];1; & \lstinline[language=Verilog];1; & \lstinline[language=Verilog];1; & {\tt \$\_DFFE\_PP1P\_}, {\tt \$\_SDFFE\_PP1P\_}, {\tt \$\_SDFFCE\_PP1P\_} \\
|
||||||
|
\end{tabular}
|
||||||
|
\caption{Cell types for gate level logic networks (FFs with reset and enable)}
|
||||||
|
\label{tab:CellLib_gates_adffe}
|
||||||
|
\end{table}
|
||||||
|
|
||||||
|
\begin{table}[t]
|
||||||
\hfil
|
\hfil
|
||||||
\begin{tabular}[t]{llll}
|
\begin{tabular}[t]{llll}
|
||||||
$ClkEdge$ & $SetLvl$ & $RstLvl$ & Cell Type \\
|
$ClkEdge$ & $SetLvl$ & $RstLvl$ & Cell Type \\
|
||||||
|
@ -527,11 +580,37 @@ $ClkEdge$ & $SetLvl$ & $RstLvl$ & Cell Type \\
|
||||||
\lstinline[language=Verilog];posedge; & \lstinline[language=Verilog];1; & \lstinline[language=Verilog];0; & {\tt \$\_DFFSR\_PPN\_} \\
|
\lstinline[language=Verilog];posedge; & \lstinline[language=Verilog];1; & \lstinline[language=Verilog];0; & {\tt \$\_DFFSR\_PPN\_} \\
|
||||||
\lstinline[language=Verilog];posedge; & \lstinline[language=Verilog];1; & \lstinline[language=Verilog];1; & {\tt \$\_DFFSR\_PPP\_} \\
|
\lstinline[language=Verilog];posedge; & \lstinline[language=Verilog];1; & \lstinline[language=Verilog];1; & {\tt \$\_DFFSR\_PPP\_} \\
|
||||||
\end{tabular}
|
\end{tabular}
|
||||||
\caption{Cell types for gate level logic networks}
|
\caption{Cell types for gate level logic networks (FFs with set and reset)}
|
||||||
\label{tab:CellLib_gates}
|
\label{tab:CellLib_gates_dffsr}
|
||||||
\end{table}
|
\end{table}
|
||||||
|
|
||||||
Table~\ref{tab:CellLib_gates} lists all cell types used for gate level logic. The cell types
|
\begin{table}[t]
|
||||||
|
\hfil
|
||||||
|
\begin{tabular}[t]{lllll}
|
||||||
|
$ClkEdge$ & $SetLvl$ & $RstLvl$ & $EnLvl$ & Cell Type \\
|
||||||
|
\hline
|
||||||
|
\lstinline[language=Verilog];negedge; & \lstinline[language=Verilog];0; & \lstinline[language=Verilog];0; & \lstinline[language=Verilog];0; & {\tt \$\_DFFSRE\_NNNN\_} \\
|
||||||
|
\lstinline[language=Verilog];negedge; & \lstinline[language=Verilog];0; & \lstinline[language=Verilog];0; & \lstinline[language=Verilog];1; & {\tt \$\_DFFSRE\_NNNP\_} \\
|
||||||
|
\lstinline[language=Verilog];negedge; & \lstinline[language=Verilog];0; & \lstinline[language=Verilog];1; & \lstinline[language=Verilog];0; & {\tt \$\_DFFSRE\_NNPN\_} \\
|
||||||
|
\lstinline[language=Verilog];negedge; & \lstinline[language=Verilog];0; & \lstinline[language=Verilog];1; & \lstinline[language=Verilog];1; & {\tt \$\_DFFSRE\_NNPP\_} \\
|
||||||
|
\lstinline[language=Verilog];negedge; & \lstinline[language=Verilog];1; & \lstinline[language=Verilog];0; & \lstinline[language=Verilog];0; & {\tt \$\_DFFSRE\_NPNN\_} \\
|
||||||
|
\lstinline[language=Verilog];negedge; & \lstinline[language=Verilog];1; & \lstinline[language=Verilog];0; & \lstinline[language=Verilog];1; & {\tt \$\_DFFSRE\_NPNP\_} \\
|
||||||
|
\lstinline[language=Verilog];negedge; & \lstinline[language=Verilog];1; & \lstinline[language=Verilog];1; & \lstinline[language=Verilog];0; & {\tt \$\_DFFSRE\_NPPN\_} \\
|
||||||
|
\lstinline[language=Verilog];negedge; & \lstinline[language=Verilog];1; & \lstinline[language=Verilog];1; & \lstinline[language=Verilog];1; & {\tt \$\_DFFSRE\_NPPP\_} \\
|
||||||
|
\lstinline[language=Verilog];posedge; & \lstinline[language=Verilog];0; & \lstinline[language=Verilog];0; & \lstinline[language=Verilog];0; & {\tt \$\_DFFSRE\_PNNN\_} \\
|
||||||
|
\lstinline[language=Verilog];posedge; & \lstinline[language=Verilog];0; & \lstinline[language=Verilog];0; & \lstinline[language=Verilog];1; & {\tt \$\_DFFSRE\_PNNP\_} \\
|
||||||
|
\lstinline[language=Verilog];posedge; & \lstinline[language=Verilog];0; & \lstinline[language=Verilog];1; & \lstinline[language=Verilog];0; & {\tt \$\_DFFSRE\_PNPN\_} \\
|
||||||
|
\lstinline[language=Verilog];posedge; & \lstinline[language=Verilog];0; & \lstinline[language=Verilog];1; & \lstinline[language=Verilog];1; & {\tt \$\_DFFSRE\_PNPP\_} \\
|
||||||
|
\lstinline[language=Verilog];posedge; & \lstinline[language=Verilog];1; & \lstinline[language=Verilog];0; & \lstinline[language=Verilog];0; & {\tt \$\_DFFSRE\_PPNN\_} \\
|
||||||
|
\lstinline[language=Verilog];posedge; & \lstinline[language=Verilog];1; & \lstinline[language=Verilog];0; & \lstinline[language=Verilog];1; & {\tt \$\_DFFSRE\_PPNP\_} \\
|
||||||
|
\lstinline[language=Verilog];posedge; & \lstinline[language=Verilog];1; & \lstinline[language=Verilog];1; & \lstinline[language=Verilog];0; & {\tt \$\_DFFSRE\_PPPN\_} \\
|
||||||
|
\lstinline[language=Verilog];posedge; & \lstinline[language=Verilog];1; & \lstinline[language=Verilog];1; & \lstinline[language=Verilog];1; & {\tt \$\_DFFSRE\_PPPP\_} \\
|
||||||
|
\end{tabular}
|
||||||
|
\caption{Cell types for gate level logic networks (FFs with set and reset and enable)}
|
||||||
|
\label{tab:CellLib_gates_dffsre}
|
||||||
|
\end{table}
|
||||||
|
|
||||||
|
Tables~\ref{tab:CellLib_gates}, \ref{tab:CellLib_gates_dffe}, \ref{tab:CellLib_gates_adff}, \ref{tab:CellLib_gates_adffe}, \ref{tab:CellLib_gates_dffsr} and \ref{tab:CellLib_gates_dffsre} list all cell types used for gate level logic. The cell types
|
||||||
{\tt \$\_NOT\_}, {\tt \$\_AND\_}, {\tt \$\_NAND\_}, {\tt \$\_ANDNOT\_}, {\tt \$\_OR\_}, {\tt \$\_NOR\_},
|
{\tt \$\_NOT\_}, {\tt \$\_AND\_}, {\tt \$\_NAND\_}, {\tt \$\_ANDNOT\_}, {\tt \$\_OR\_}, {\tt \$\_NOR\_},
|
||||||
{\tt \$\_ORNOT\_}, {\tt \$\_XOR\_}, {\tt \$\_XNOR\_} and {\tt \$\_MUX\_} are used to model combinatorial logic.
|
{\tt \$\_ORNOT\_}, {\tt \$\_XOR\_}, {\tt \$\_XNOR\_} and {\tt \$\_MUX\_} are used to model combinatorial logic.
|
||||||
The cell type {\tt \$\_TBUF\_} is used to model tristate logic.
|
The cell type {\tt \$\_TBUF\_} is used to model tristate logic.
|
||||||
|
@ -563,8 +642,61 @@ otherwise.
|
||||||
Q <= D;
|
Q <= D;
|
||||||
\end{lstlisting}
|
\end{lstlisting}
|
||||||
|
|
||||||
The cell types {\tt \$\_DFFSR\_NNN\_}, {\tt \$\_DFFSR\_NNP\_}, {\tt \$\_DFFSR\_NPN\_}, {\tt \$\_DFFSR\_NPP\_},
|
The cell types {\tt \$\_SDFF\_NN0\_}, {\tt \$\_SDFF\_NN1\_}, {\tt \$\_SDFF\_NP0\_}, {\tt \$\_SDFF\_NP1\_},
|
||||||
{\tt \$\_DFFSR\_PNN\_}, {\tt \$\_DFFSR\_PNP\_}, {\tt \$\_DFFSR\_PPN\_} and {\tt \$\_DFFSR\_PPP\_} implement
|
{\tt \$\_SDFF\_PN0\_}, {\tt \$\_SDFF\_PN1\_}, {\tt \$\_SDFF\_PP0\_} and {\tt \$\_SDFF\_PP1\_} implement
|
||||||
|
d-type flip-flops with synchronous reset. The values in the table for these cell types relate to the
|
||||||
|
following Verilog code template:
|
||||||
|
|
||||||
|
\begin{lstlisting}[mathescape,language=Verilog]
|
||||||
|
always @($ClkEdge$ C)
|
||||||
|
if (R == $RstLvl$)
|
||||||
|
Q <= $RstVal$;
|
||||||
|
else
|
||||||
|
Q <= D;
|
||||||
|
\end{lstlisting}
|
||||||
|
|
||||||
|
The cell types {\tt \$\_DFFE\_[NP][NP][01][NP]\_} implement
|
||||||
|
d-type flip-flops with asynchronous reset and enable. The values in the table for these cell types relate to the
|
||||||
|
following Verilog code template, where \lstinline[mathescape,language=Verilog];$RstEdge$; is \lstinline[language=Verilog];posedge;
|
||||||
|
if \lstinline[mathescape,language=Verilog];$RstLvl$; if \lstinline[language=Verilog];1;, and \lstinline[language=Verilog];negedge;
|
||||||
|
otherwise.
|
||||||
|
|
||||||
|
\begin{lstlisting}[mathescape,language=Verilog]
|
||||||
|
always @($ClkEdge$ C, $RstEdge$ R)
|
||||||
|
if (R == $RstLvl$)
|
||||||
|
Q <= $RstVal$;
|
||||||
|
else if (EN == $EnLvl$)
|
||||||
|
Q <= D;
|
||||||
|
\end{lstlisting}
|
||||||
|
|
||||||
|
The cell types {\tt \$\_SDFFE\_[NP][NP][01][NP]\_} implement d-type flip-flops
|
||||||
|
with synchronous reset and enable, with reset having priority over enable.
|
||||||
|
The values in the table for these cell types relate to the
|
||||||
|
following Verilog code template:
|
||||||
|
|
||||||
|
\begin{lstlisting}[mathescape,language=Verilog]
|
||||||
|
always @($ClkEdge$ C)
|
||||||
|
if (R == $RstLvl$)
|
||||||
|
Q <= $RstVal$;
|
||||||
|
else if (EN == $EnLvl$)
|
||||||
|
Q <= D;
|
||||||
|
\end{lstlisting}
|
||||||
|
|
||||||
|
The cell types {\tt \$\_SDFFCE\_[NP][NP][01][NP]\_} implement d-type flip-flops
|
||||||
|
with synchronous reset and enable, with enable having priority over reset.
|
||||||
|
The values in the table for these cell types relate to the
|
||||||
|
following Verilog code template:
|
||||||
|
|
||||||
|
\begin{lstlisting}[mathescape,language=Verilog]
|
||||||
|
always @($ClkEdge$ C)
|
||||||
|
if (EN == $EnLvl$)
|
||||||
|
if (R == $RstLvl$)
|
||||||
|
Q <= $RstVal$;
|
||||||
|
else
|
||||||
|
Q <= D;
|
||||||
|
\end{lstlisting}
|
||||||
|
|
||||||
|
The cell types {\tt \$\_DFFSR\_[NP][NP][NP]\_} implement
|
||||||
d-type flip-flops with asynchronous set and reset. The values in the table for these cell types relate to the
|
d-type flip-flops with asynchronous set and reset. The values in the table for these cell types relate to the
|
||||||
following Verilog code template, where \lstinline[mathescape,language=Verilog];$RstEdge$; is \lstinline[language=Verilog];posedge;
|
following Verilog code template, where \lstinline[mathescape,language=Verilog];$RstEdge$; is \lstinline[language=Verilog];posedge;
|
||||||
if \lstinline[mathescape,language=Verilog];$RstLvl$; if \lstinline[language=Verilog];1;, \lstinline[language=Verilog];negedge;
|
if \lstinline[mathescape,language=Verilog];$RstLvl$; if \lstinline[language=Verilog];1;, \lstinline[language=Verilog];negedge;
|
||||||
|
@ -582,6 +714,24 @@ otherwise.
|
||||||
Q <= D;
|
Q <= D;
|
||||||
\end{lstlisting}
|
\end{lstlisting}
|
||||||
|
|
||||||
|
The cell types {\tt \$\_DFFSRE\_[NP][NP][NP][NP]\_} implement
|
||||||
|
d-type flip-flops with asynchronous set and reset and enable. The values in the table for these cell types relate to the
|
||||||
|
following Verilog code template, where \lstinline[mathescape,language=Verilog];$RstEdge$; is \lstinline[language=Verilog];posedge;
|
||||||
|
if \lstinline[mathescape,language=Verilog];$RstLvl$; if \lstinline[language=Verilog];1;, \lstinline[language=Verilog];negedge;
|
||||||
|
otherwise, and \lstinline[mathescape,language=Verilog];$SetEdge$; is \lstinline[language=Verilog];posedge;
|
||||||
|
if \lstinline[mathescape,language=Verilog];$SetLvl$; if \lstinline[language=Verilog];1;, \lstinline[language=Verilog];negedge;
|
||||||
|
otherwise.
|
||||||
|
|
||||||
|
\begin{lstlisting}[mathescape,language=Verilog]
|
||||||
|
always @($ClkEdge$ C, $RstEdge$ R, $SetEdge$ S)
|
||||||
|
if (R == $RstLvl$)
|
||||||
|
Q <= 0;
|
||||||
|
else if (S == $SetLvl$)
|
||||||
|
Q <= 1;
|
||||||
|
else if (E == $EnLvl$)
|
||||||
|
Q <= D;
|
||||||
|
\end{lstlisting}
|
||||||
|
|
||||||
In most cases gate level logic networks are created from RTL networks using the {\tt techmap} pass. The flip-flop cells
|
In most cases gate level logic networks are created from RTL networks using the {\tt techmap} pass. The flip-flop cells
|
||||||
from the gate level logic network can be mapped to physical flip-flop cells from a Liberty file using the {\tt dfflibmap}
|
from the gate level logic network can be mapped to physical flip-flop cells from a Liberty file using the {\tt dfflibmap}
|
||||||
pass. The combinatorial logic cells can be mapped to physical cells from a Liberty file via ABC \citeweblink{ABC}
|
pass. The combinatorial logic cells can be mapped to physical cells from a Liberty file via ABC \citeweblink{ABC}
|
||||||
|
|
|
@ -117,7 +117,10 @@ struct statdata_t
|
||||||
}
|
}
|
||||||
else if (cell_type.in(ID($mux), ID($pmux)))
|
else if (cell_type.in(ID($mux), ID($pmux)))
|
||||||
cell_type = stringf("%s_%d", cell_type.c_str(), GetSize(cell->getPort(ID::Y)));
|
cell_type = stringf("%s_%d", cell_type.c_str(), GetSize(cell->getPort(ID::Y)));
|
||||||
else if (cell_type.in(ID($sr), ID($dff), ID($dffsr), ID($adff), ID($dlatch), ID($dlatchsr)))
|
else if (cell_type.in(
|
||||||
|
ID($sr), ID($ff), ID($dff), ID($dffe), ID($dffsr), ID($dffsre),
|
||||||
|
ID($adff), ID($adffe), ID($sdff), ID($sdffe), ID($sdffce),
|
||||||
|
ID($dlatch), ID($adlatch), ID($dlatchsr)))
|
||||||
cell_type = stringf("%s_%d", cell_type.c_str(), GetSize(cell->getPort(ID::Q)));
|
cell_type = stringf("%s_%d", cell_type.c_str(), GetSize(cell->getPort(ID::Q)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -467,15 +467,21 @@ void replace_const_cells(RTLIL::Design *design, RTLIL::Module *module, bool cons
|
||||||
|
|
||||||
if (clkinv)
|
if (clkinv)
|
||||||
{
|
{
|
||||||
if (cell->type.in(ID($dff), ID($dffe), ID($dffsr), ID($adff), ID($fsm), ID($memrd), ID($memwr)))
|
if (cell->type.in(ID($dff), ID($dffe), ID($dffsr), ID($dffsre), ID($adff), ID($adffe), ID($sdff), ID($sdffe), ID($sdffce), ID($fsm), ID($memrd), ID($memwr)))
|
||||||
handle_polarity_inv(cell, ID::CLK, ID::CLK_POLARITY, assign_map, invert_map);
|
handle_polarity_inv(cell, ID::CLK, ID::CLK_POLARITY, assign_map, invert_map);
|
||||||
|
|
||||||
if (cell->type.in(ID($sr), ID($dffsr), ID($dlatchsr))) {
|
if (cell->type.in(ID($sr), ID($dffsr), ID($dffsre), ID($dlatchsr))) {
|
||||||
handle_polarity_inv(cell, ID::SET, ID::SET_POLARITY, assign_map, invert_map);
|
handle_polarity_inv(cell, ID::SET, ID::SET_POLARITY, assign_map, invert_map);
|
||||||
handle_polarity_inv(cell, ID::CLR, ID::CLR_POLARITY, assign_map, invert_map);
|
handle_polarity_inv(cell, ID::CLR, ID::CLR_POLARITY, assign_map, invert_map);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cell->type.in(ID($dffe), ID($dlatch), ID($dlatchsr)))
|
if (cell->type.in(ID($adff), ID($adffe), ID($adlatch)))
|
||||||
|
handle_polarity_inv(cell, ID::ARST, ID::ARST_POLARITY, assign_map, invert_map);
|
||||||
|
|
||||||
|
if (cell->type.in(ID($sdff), ID($sdffe), ID($sdffce)))
|
||||||
|
handle_polarity_inv(cell, ID::SRST, ID::SRST_POLARITY, assign_map, invert_map);
|
||||||
|
|
||||||
|
if (cell->type.in(ID($dffe), ID($adffe), ID($sdffe), ID($sdffce), ID($dffsre), ID($dlatch), ID($adlatch), ID($dlatchsr)))
|
||||||
handle_polarity_inv(cell, ID::EN, ID::EN_POLARITY, assign_map, invert_map);
|
handle_polarity_inv(cell, ID::EN, ID::EN_POLARITY, assign_map, invert_map);
|
||||||
|
|
||||||
handle_clkpol_celltype_swap(cell, "$_SR_N?_", "$_SR_P?_", ID::S, assign_map, invert_map);
|
handle_clkpol_celltype_swap(cell, "$_SR_N?_", "$_SR_P?_", ID::S, assign_map, invert_map);
|
||||||
|
@ -489,12 +495,35 @@ void replace_const_cells(RTLIL::Design *design, RTLIL::Module *module, bool cons
|
||||||
handle_clkpol_celltype_swap(cell, "$_DFF_N??_", "$_DFF_P??_", ID::C, assign_map, invert_map);
|
handle_clkpol_celltype_swap(cell, "$_DFF_N??_", "$_DFF_P??_", ID::C, assign_map, invert_map);
|
||||||
handle_clkpol_celltype_swap(cell, "$_DFF_?N?_", "$_DFF_?P?_", ID::R, assign_map, invert_map);
|
handle_clkpol_celltype_swap(cell, "$_DFF_?N?_", "$_DFF_?P?_", ID::R, assign_map, invert_map);
|
||||||
|
|
||||||
|
handle_clkpol_celltype_swap(cell, "$_DFFE_N???_", "$_DFFE_P???_", ID::C, assign_map, invert_map);
|
||||||
|
handle_clkpol_celltype_swap(cell, "$_DFFE_?N??_", "$_DFFE_?P??_", ID::R, assign_map, invert_map);
|
||||||
|
handle_clkpol_celltype_swap(cell, "$_DFFE_???N_", "$_DFFE_???P_", ID::E, assign_map, invert_map);
|
||||||
|
|
||||||
|
handle_clkpol_celltype_swap(cell, "$_SDFF_N??_", "$_SDFF_P??_", ID::C, assign_map, invert_map);
|
||||||
|
handle_clkpol_celltype_swap(cell, "$_SDFF_?N?_", "$_SDFF_?P?_", ID::R, assign_map, invert_map);
|
||||||
|
|
||||||
|
handle_clkpol_celltype_swap(cell, "$_SDFFE_N???_", "$_SDFFE_P???_", ID::C, assign_map, invert_map);
|
||||||
|
handle_clkpol_celltype_swap(cell, "$_SDFFE_?N??_", "$_SDFFE_?P??_", ID::R, assign_map, invert_map);
|
||||||
|
handle_clkpol_celltype_swap(cell, "$_SDFFE_???N_", "$_SDFFE_???P_", ID::E, assign_map, invert_map);
|
||||||
|
|
||||||
|
handle_clkpol_celltype_swap(cell, "$_SDFFCE_N???_", "$_SDFFCE_P???_", ID::C, assign_map, invert_map);
|
||||||
|
handle_clkpol_celltype_swap(cell, "$_SDFFCE_?N??_", "$_SDFFCE_?P??_", ID::R, assign_map, invert_map);
|
||||||
|
handle_clkpol_celltype_swap(cell, "$_SDFFCE_???N_", "$_SDFFCE_???P_", ID::E, assign_map, invert_map);
|
||||||
|
|
||||||
handle_clkpol_celltype_swap(cell, "$_DFFSR_N??_", "$_DFFSR_P??_", ID::C, assign_map, invert_map);
|
handle_clkpol_celltype_swap(cell, "$_DFFSR_N??_", "$_DFFSR_P??_", ID::C, assign_map, invert_map);
|
||||||
handle_clkpol_celltype_swap(cell, "$_DFFSR_?N?_", "$_DFFSR_?P?_", ID::S, assign_map, invert_map);
|
handle_clkpol_celltype_swap(cell, "$_DFFSR_?N?_", "$_DFFSR_?P?_", ID::S, assign_map, invert_map);
|
||||||
handle_clkpol_celltype_swap(cell, "$_DFFSR_??N_", "$_DFFSR_??P_", ID::R, assign_map, invert_map);
|
handle_clkpol_celltype_swap(cell, "$_DFFSR_??N_", "$_DFFSR_??P_", ID::R, assign_map, invert_map);
|
||||||
|
|
||||||
|
handle_clkpol_celltype_swap(cell, "$_DFFSRE_N???_", "$_DFFSRE_P???_", ID::C, assign_map, invert_map);
|
||||||
|
handle_clkpol_celltype_swap(cell, "$_DFFSRE_?N??_", "$_DFFSRE_?P??_", ID::S, assign_map, invert_map);
|
||||||
|
handle_clkpol_celltype_swap(cell, "$_DFFSRE_??N?_", "$_DFFSRE_??P?_", ID::R, assign_map, invert_map);
|
||||||
|
handle_clkpol_celltype_swap(cell, "$_DFFSRE_???N_", "$_DFFSRE_???P_", ID::E, assign_map, invert_map);
|
||||||
|
|
||||||
handle_clkpol_celltype_swap(cell, "$_DLATCH_N_", "$_DLATCH_P_", ID::E, assign_map, invert_map);
|
handle_clkpol_celltype_swap(cell, "$_DLATCH_N_", "$_DLATCH_P_", ID::E, assign_map, invert_map);
|
||||||
|
|
||||||
|
handle_clkpol_celltype_swap(cell, "$_DLATCH_N??_", "$_DLATCH_P??_", ID::E, assign_map, invert_map);
|
||||||
|
handle_clkpol_celltype_swap(cell, "$_DLATCH_?N?_", "$_DLATCH_?P?_", ID::R, assign_map, invert_map);
|
||||||
|
|
||||||
handle_clkpol_celltype_swap(cell, "$_DLATCHSR_N??_", "$_DLATCHSR_P??_", ID::E, assign_map, invert_map);
|
handle_clkpol_celltype_swap(cell, "$_DLATCHSR_N??_", "$_DLATCHSR_P??_", ID::E, assign_map, invert_map);
|
||||||
handle_clkpol_celltype_swap(cell, "$_DLATCHSR_?N?_", "$_DLATCHSR_?P?_", ID::S, assign_map, invert_map);
|
handle_clkpol_celltype_swap(cell, "$_DLATCHSR_?N?_", "$_DLATCHSR_?P?_", ID::S, assign_map, invert_map);
|
||||||
handle_clkpol_celltype_swap(cell, "$_DLATCHSR_??N_", "$_DLATCHSR_??P_", ID::R, assign_map, invert_map);
|
handle_clkpol_celltype_swap(cell, "$_DLATCHSR_??N_", "$_DLATCHSR_??P_", ID::R, assign_map, invert_map);
|
||||||
|
|
|
@ -63,11 +63,13 @@ struct OnehotDatabase
|
||||||
vector<SigSpec> inputs;
|
vector<SigSpec> inputs;
|
||||||
SigSpec output;
|
SigSpec output;
|
||||||
|
|
||||||
if (cell->type.in(ID($adff), ID($dff), ID($dffe), ID($dlatch), ID($ff)))
|
if (cell->type.in(ID($adff), ID($adffe), ID($dff), ID($dffe), ID($sdff), ID($sdffe), ID($sdffce), ID($dlatch), ID($adlatch), ID($ff)))
|
||||||
{
|
{
|
||||||
output = cell->getPort(ID::Q);
|
output = cell->getPort(ID::Q);
|
||||||
if (cell->type == ID($adff))
|
if (cell->type.in(ID($adff), ID($adffe), ID($adlatch)))
|
||||||
inputs.push_back(cell->getParam(ID::ARST_VALUE));
|
inputs.push_back(cell->getParam(ID::ARST_VALUE));
|
||||||
|
if (cell->type.in(ID($sdff), ID($sdffe), ID($sdffce)))
|
||||||
|
inputs.push_back(cell->getParam(ID::SRST_VALUE));
|
||||||
inputs.push_back(cell->getPort(ID::D));
|
inputs.push_back(cell->getPort(ID::D));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -39,7 +39,8 @@ struct WreduceConfig
|
||||||
ID($lt), ID($le), ID($eq), ID($ne), ID($eqx), ID($nex), ID($ge), ID($gt),
|
ID($lt), ID($le), ID($eq), ID($ne), ID($eqx), ID($nex), ID($ge), ID($gt),
|
||||||
ID($add), ID($sub), ID($mul), // ID($div), ID($mod), ID($divfloor), ID($modfloor), ID($pow),
|
ID($add), ID($sub), ID($mul), // ID($div), ID($mod), ID($divfloor), ID($modfloor), ID($pow),
|
||||||
ID($mux), ID($pmux),
|
ID($mux), ID($pmux),
|
||||||
ID($dff), ID($adff)
|
ID($dff), ID($dffe), ID($adff), ID($adffe), ID($sdff), ID($sdffe), ID($sdffce),
|
||||||
|
ID($dlatch), ID($adlatch),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -143,8 +144,8 @@ struct WreduceWorker
|
||||||
|
|
||||||
SigSpec sig_d = mi.sigmap(cell->getPort(ID::D));
|
SigSpec sig_d = mi.sigmap(cell->getPort(ID::D));
|
||||||
SigSpec sig_q = mi.sigmap(cell->getPort(ID::Q));
|
SigSpec sig_q = mi.sigmap(cell->getPort(ID::Q));
|
||||||
bool is_adff = (cell->type == ID($adff));
|
bool has_reset = false;
|
||||||
Const initval, arst_value;
|
Const initval, rst_value;
|
||||||
|
|
||||||
int width_before = GetSize(sig_q);
|
int width_before = GetSize(sig_q);
|
||||||
|
|
||||||
|
@ -152,7 +153,11 @@ struct WreduceWorker
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (cell->parameters.count(ID::ARST_VALUE)) {
|
if (cell->parameters.count(ID::ARST_VALUE)) {
|
||||||
arst_value = cell->parameters[ID::ARST_VALUE];
|
rst_value = cell->parameters[ID::ARST_VALUE];
|
||||||
|
has_reset = true;
|
||||||
|
} else if (cell->parameters.count(ID::SRST_VALUE)) {
|
||||||
|
rst_value = cell->parameters[ID::SRST_VALUE];
|
||||||
|
has_reset = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool zero_ext = sig_d[GetSize(sig_d)-1] == State::S0;
|
bool zero_ext = sig_d[GetSize(sig_d)-1] == State::S0;
|
||||||
|
@ -169,7 +174,7 @@ struct WreduceWorker
|
||||||
for (int i = GetSize(sig_q)-1; i >= 0; i--)
|
for (int i = GetSize(sig_q)-1; i >= 0; i--)
|
||||||
{
|
{
|
||||||
if (zero_ext && sig_d[i] == State::S0 && (initval[i] == State::S0 || initval[i] == State::Sx) &&
|
if (zero_ext && sig_d[i] == State::S0 && (initval[i] == State::S0 || initval[i] == State::Sx) &&
|
||||||
(!is_adff || i >= GetSize(arst_value) || arst_value[i] == State::S0 || arst_value[i] == State::Sx)) {
|
(!has_reset || i >= GetSize(rst_value) || rst_value[i] == State::S0 || rst_value[i] == State::Sx)) {
|
||||||
module->connect(sig_q[i], State::S0);
|
module->connect(sig_q[i], State::S0);
|
||||||
remove_init_bits.insert(sig_q[i]);
|
remove_init_bits.insert(sig_q[i]);
|
||||||
sig_d.remove(i);
|
sig_d.remove(i);
|
||||||
|
@ -178,7 +183,7 @@ struct WreduceWorker
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sign_ext && i > 0 && sig_d[i] == sig_d[i-1] && initval[i] == initval[i-1] &&
|
if (sign_ext && i > 0 && sig_d[i] == sig_d[i-1] && initval[i] == initval[i-1] &&
|
||||||
(!is_adff || i >= GetSize(arst_value) || arst_value[i] == arst_value[i-1])) {
|
(!has_reset || i >= GetSize(rst_value) || rst_value[i] == rst_value[i-1])) {
|
||||||
module->connect(sig_q[i], sig_q[i-1]);
|
module->connect(sig_q[i], sig_q[i-1]);
|
||||||
remove_init_bits.insert(sig_q[i]);
|
remove_init_bits.insert(sig_q[i]);
|
||||||
sig_d.remove(i);
|
sig_d.remove(i);
|
||||||
|
@ -221,8 +226,11 @@ struct WreduceWorker
|
||||||
|
|
||||||
// Narrow ARST_VALUE parameter to new size.
|
// Narrow ARST_VALUE parameter to new size.
|
||||||
if (cell->parameters.count(ID::ARST_VALUE)) {
|
if (cell->parameters.count(ID::ARST_VALUE)) {
|
||||||
arst_value.bits.resize(GetSize(sig_q));
|
rst_value.bits.resize(GetSize(sig_q));
|
||||||
cell->setParam(ID::ARST_VALUE, arst_value);
|
cell->setParam(ID::ARST_VALUE, rst_value);
|
||||||
|
} else if (cell->parameters.count(ID::SRST_VALUE)) {
|
||||||
|
rst_value.bits.resize(GetSize(sig_q));
|
||||||
|
cell->setParam(ID::SRST_VALUE, rst_value);
|
||||||
}
|
}
|
||||||
|
|
||||||
cell->setPort(ID::D, sig_d);
|
cell->setPort(ID::D, sig_d);
|
||||||
|
@ -272,7 +280,7 @@ struct WreduceWorker
|
||||||
if (cell->type.in(ID($mux), ID($pmux)))
|
if (cell->type.in(ID($mux), ID($pmux)))
|
||||||
return run_cell_mux(cell);
|
return run_cell_mux(cell);
|
||||||
|
|
||||||
if (cell->type.in(ID($dff), ID($adff)))
|
if (cell->type.in(ID($dff), ID($dffe), ID($adff), ID($adffe), ID($sdff), ID($sdffe), ID($sdffce), ID($dlatch), ID($adlatch)))
|
||||||
return run_cell_dff(cell);
|
return run_cell_dff(cell);
|
||||||
|
|
||||||
SigSpec sig = mi.sigmap(cell->getPort(ID::Y));
|
SigSpec sig = mi.sigmap(cell->getPort(ID::Y));
|
||||||
|
|
|
@ -282,9 +282,9 @@ struct Dff2dffePass : public Pass {
|
||||||
log("\n");
|
log("\n");
|
||||||
log(" -direct-match <pattern>\n");
|
log(" -direct-match <pattern>\n");
|
||||||
log(" like -direct for all DFF cell types matching the expression.\n");
|
log(" like -direct for all DFF cell types matching the expression.\n");
|
||||||
log(" this will use $__DFFE_* as <external_gate_type> matching the\n");
|
log(" this will use $_DFFE_* as <external_gate_type> matching the\n");
|
||||||
log(" internal gate type $_DFF_*_, and $__DFFSE_* for those matching\n");
|
log(" internal gate type $_DFF_*_, and $_SDFFE_* for those matching\n");
|
||||||
log(" $_DFFS_*_, except for $_DFF_[NP]_, which is converted to \n");
|
log(" $_SDFF_*_, except for $_DFF_[NP]_, which is converted to \n");
|
||||||
log(" $_DFFE_[NP]_.\n");
|
log(" $_DFFE_[NP]_.\n");
|
||||||
log("\n");
|
log("\n");
|
||||||
}
|
}
|
||||||
|
@ -318,23 +318,23 @@ struct Dff2dffePass : public Pass {
|
||||||
const char *pattern = args[++argidx].c_str();
|
const char *pattern = args[++argidx].c_str();
|
||||||
if (patmatch(pattern, "$_DFF_P_" )) found_match = true, direct_dict[ID($_DFF_P_) ] = ID($_DFFE_PP_);
|
if (patmatch(pattern, "$_DFF_P_" )) found_match = true, direct_dict[ID($_DFF_P_) ] = ID($_DFFE_PP_);
|
||||||
if (patmatch(pattern, "$_DFF_N_" )) found_match = true, direct_dict[ID($_DFF_N_) ] = ID($_DFFE_NP_);
|
if (patmatch(pattern, "$_DFF_N_" )) found_match = true, direct_dict[ID($_DFF_N_) ] = ID($_DFFE_NP_);
|
||||||
if (patmatch(pattern, "$_DFF_NN0_")) found_match = true, direct_dict[ID($_DFF_NN0_)] = ID($__DFFE_NN0);
|
if (patmatch(pattern, "$_DFF_NN0_")) found_match = true, direct_dict[ID($_DFF_NN0_)] = ID($_DFFE_NN0P_);
|
||||||
if (patmatch(pattern, "$_DFF_NN1_")) found_match = true, direct_dict[ID($_DFF_NN1_)] = ID($__DFFE_NN1);
|
if (patmatch(pattern, "$_DFF_NN1_")) found_match = true, direct_dict[ID($_DFF_NN1_)] = ID($_DFFE_NN1P_);
|
||||||
if (patmatch(pattern, "$_DFF_NP0_")) found_match = true, direct_dict[ID($_DFF_NP0_)] = ID($__DFFE_NP0);
|
if (patmatch(pattern, "$_DFF_NP0_")) found_match = true, direct_dict[ID($_DFF_NP0_)] = ID($_DFFE_NP0P_);
|
||||||
if (patmatch(pattern, "$_DFF_NP1_")) found_match = true, direct_dict[ID($_DFF_NP1_)] = ID($__DFFE_NP1);
|
if (patmatch(pattern, "$_DFF_NP1_")) found_match = true, direct_dict[ID($_DFF_NP1_)] = ID($_DFFE_NP1P_);
|
||||||
if (patmatch(pattern, "$_DFF_PN0_")) found_match = true, direct_dict[ID($_DFF_PN0_)] = ID($__DFFE_PN0);
|
if (patmatch(pattern, "$_DFF_PN0_")) found_match = true, direct_dict[ID($_DFF_PN0_)] = ID($_DFFE_PN0P_);
|
||||||
if (patmatch(pattern, "$_DFF_PN1_")) found_match = true, direct_dict[ID($_DFF_PN1_)] = ID($__DFFE_PN1);
|
if (patmatch(pattern, "$_DFF_PN1_")) found_match = true, direct_dict[ID($_DFF_PN1_)] = ID($_DFFE_PN1P_);
|
||||||
if (patmatch(pattern, "$_DFF_PP0_")) found_match = true, direct_dict[ID($_DFF_PP0_)] = ID($__DFFE_PP0);
|
if (patmatch(pattern, "$_DFF_PP0_")) found_match = true, direct_dict[ID($_DFF_PP0_)] = ID($_DFFE_PP0P_);
|
||||||
if (patmatch(pattern, "$_DFF_PP1_")) found_match = true, direct_dict[ID($_DFF_PP1_)] = ID($__DFFE_PP1);
|
if (patmatch(pattern, "$_DFF_PP1_")) found_match = true, direct_dict[ID($_DFF_PP1_)] = ID($_DFFE_PP1P_);
|
||||||
|
|
||||||
if (patmatch(pattern, "$__DFFS_NN0_")) found_match = true, direct_dict[ID($__DFFS_NN0_)] = ID($__DFFSE_NN0);
|
if (patmatch(pattern, "$_SDFF_NN0_")) found_match = true, direct_dict[ID($_SDFF_NN0_)] = ID($_SDFFE_NN0P_);
|
||||||
if (patmatch(pattern, "$__DFFS_NN1_")) found_match = true, direct_dict[ID($__DFFS_NN1_)] = ID($__DFFSE_NN1);
|
if (patmatch(pattern, "$_SDFF_NN1_")) found_match = true, direct_dict[ID($_SDFF_NN1_)] = ID($_SDFFE_NN1P_);
|
||||||
if (patmatch(pattern, "$__DFFS_NP0_")) found_match = true, direct_dict[ID($__DFFS_NP0_)] = ID($__DFFSE_NP0);
|
if (patmatch(pattern, "$_SDFF_NP0_")) found_match = true, direct_dict[ID($_SDFF_NP0_)] = ID($_SDFFE_NP0P_);
|
||||||
if (patmatch(pattern, "$__DFFS_NP1_")) found_match = true, direct_dict[ID($__DFFS_NP1_)] = ID($__DFFSE_NP1);
|
if (patmatch(pattern, "$_SDFF_NP1_")) found_match = true, direct_dict[ID($_SDFF_NP1_)] = ID($_SDFFE_NP1P_);
|
||||||
if (patmatch(pattern, "$__DFFS_PN0_")) found_match = true, direct_dict[ID($__DFFS_PN0_)] = ID($__DFFSE_PN0);
|
if (patmatch(pattern, "$_SDFF_PN0_")) found_match = true, direct_dict[ID($_SDFF_PN0_)] = ID($_SDFFE_PN0P_);
|
||||||
if (patmatch(pattern, "$__DFFS_PN1_")) found_match = true, direct_dict[ID($__DFFS_PN1_)] = ID($__DFFSE_PN1);
|
if (patmatch(pattern, "$_SDFF_PN1_")) found_match = true, direct_dict[ID($_SDFF_PN1_)] = ID($_SDFFE_PN1P_);
|
||||||
if (patmatch(pattern, "$__DFFS_PP0_")) found_match = true, direct_dict[ID($__DFFS_PP0_)] = ID($__DFFSE_PP0);
|
if (patmatch(pattern, "$_SDFF_PP0_")) found_match = true, direct_dict[ID($_SDFF_PP0_)] = ID($_SDFFE_PP0P_);
|
||||||
if (patmatch(pattern, "$__DFFS_PP1_")) found_match = true, direct_dict[ID($__DFFS_PP1_)] = ID($__DFFSE_PP1);
|
if (patmatch(pattern, "$_SDFF_PP1_")) found_match = true, direct_dict[ID($_SDFF_PP1_)] = ID($_SDFFE_PP1P_);
|
||||||
if (!found_match)
|
if (!found_match)
|
||||||
log_cmd_error("No cell types matched pattern '%s'.\n", pattern);
|
log_cmd_error("No cell types matched pattern '%s'.\n", pattern);
|
||||||
continue;
|
continue;
|
||||||
|
|
|
@ -31,7 +31,7 @@ struct Dff2dffsPass : public Pass {
|
||||||
log("\n");
|
log("\n");
|
||||||
log(" dff2dffs [options] [selection]\n");
|
log(" dff2dffs [options] [selection]\n");
|
||||||
log("\n");
|
log("\n");
|
||||||
log("Merge synchronous set/reset $_MUX_ cells to create $__DFFS_[NP][NP][01], to be run before\n");
|
log("Merge synchronous set/reset $_MUX_ cells to create $_SDFF_[NP][NP][01]_, to be run before\n");
|
||||||
log("dff2dffe for SR over CE priority.\n");
|
log("dff2dffe for SR over CE priority.\n");
|
||||||
log("\n");
|
log("\n");
|
||||||
log(" -match-init\n");
|
log(" -match-init\n");
|
||||||
|
@ -138,21 +138,21 @@ struct Dff2dffsPass : public Pass {
|
||||||
|
|
||||||
if (sr_val == State::S1) {
|
if (sr_val == State::S1) {
|
||||||
if (cell->type == ID($_DFF_N_)) {
|
if (cell->type == ID($_DFF_N_)) {
|
||||||
if (invert_sr) cell->type = ID($__DFFS_NN1_);
|
if (invert_sr) cell->type = ID($_SDFF_NN1_);
|
||||||
else cell->type = ID($__DFFS_NP1_);
|
else cell->type = ID($_SDFF_NP1_);
|
||||||
} else {
|
} else {
|
||||||
log_assert(cell->type == ID($_DFF_P_));
|
log_assert(cell->type == ID($_DFF_P_));
|
||||||
if (invert_sr) cell->type = ID($__DFFS_PN1_);
|
if (invert_sr) cell->type = ID($_SDFF_PN1_);
|
||||||
else cell->type = ID($__DFFS_PP1_);
|
else cell->type = ID($_SDFF_PP1_);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (cell->type == ID($_DFF_N_)) {
|
if (cell->type == ID($_DFF_N_)) {
|
||||||
if (invert_sr) cell->type = ID($__DFFS_NN0_);
|
if (invert_sr) cell->type = ID($_SDFF_NN0_);
|
||||||
else cell->type = ID($__DFFS_NP0_);
|
else cell->type = ID($_SDFF_NP0_);
|
||||||
} else {
|
} else {
|
||||||
log_assert(cell->type == ID($_DFF_P_));
|
log_assert(cell->type == ID($_DFF_P_));
|
||||||
if (invert_sr) cell->type = ID($__DFFS_PN0_);
|
if (invert_sr) cell->type = ID($_SDFF_PN0_);
|
||||||
else cell->type = ID($__DFFS_PP0_);
|
else cell->type = ID($_SDFF_PP0_);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cell->setPort(ID::R, sr_sig);
|
cell->setPort(ID::R, sr_sig);
|
||||||
|
|
|
@ -474,23 +474,54 @@ void simplemap_dffsr(RTLIL::Module *module, RTLIL::Cell *cell)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void simplemap_adff(RTLIL::Module *module, RTLIL::Cell *cell)
|
void simplemap_dffsre(RTLIL::Module *module, RTLIL::Cell *cell)
|
||||||
{
|
{
|
||||||
int width = cell->parameters.at(ID::WIDTH).as_int();
|
int width = cell->parameters.at(ID::WIDTH).as_int();
|
||||||
char clk_pol = cell->parameters.at(ID::CLK_POLARITY).as_bool() ? 'P' : 'N';
|
char clk_pol = cell->parameters.at(ID::CLK_POLARITY).as_bool() ? 'P' : 'N';
|
||||||
char rst_pol = cell->parameters.at(ID::ARST_POLARITY).as_bool() ? 'P' : 'N';
|
char set_pol = cell->parameters.at(ID::SET_POLARITY).as_bool() ? 'P' : 'N';
|
||||||
|
char clr_pol = cell->parameters.at(ID::CLR_POLARITY).as_bool() ? 'P' : 'N';
|
||||||
|
char en_pol = cell->parameters.at(ID::EN_POLARITY).as_bool() ? 'P' : 'N';
|
||||||
|
|
||||||
std::vector<RTLIL::State> rst_val = cell->parameters.at(ID::ARST_VALUE).bits;
|
RTLIL::SigSpec sig_clk = cell->getPort(ID::CLK);
|
||||||
|
RTLIL::SigSpec sig_s = cell->getPort(ID::SET);
|
||||||
|
RTLIL::SigSpec sig_r = cell->getPort(ID::CLR);
|
||||||
|
RTLIL::SigSpec sig_e = cell->getPort(ID::EN);
|
||||||
|
RTLIL::SigSpec sig_d = cell->getPort(ID::D);
|
||||||
|
RTLIL::SigSpec sig_q = cell->getPort(ID::Q);
|
||||||
|
|
||||||
|
IdString gate_type = stringf("$_DFFSR_%c%c%c%c_", clk_pol, set_pol, clr_pol, en_pol);
|
||||||
|
|
||||||
|
for (int i = 0; i < width; i++) {
|
||||||
|
RTLIL::Cell *gate = module->addCell(NEW_ID, gate_type);
|
||||||
|
gate->add_strpool_attribute(ID::src, cell->get_strpool_attribute(ID::src));
|
||||||
|
gate->setPort(ID::C, sig_clk);
|
||||||
|
gate->setPort(ID::S, sig_s[i]);
|
||||||
|
gate->setPort(ID::R, sig_r[i]);
|
||||||
|
gate->setPort(ID::E, sig_e);
|
||||||
|
gate->setPort(ID::D, sig_d[i]);
|
||||||
|
gate->setPort(ID::Q, sig_q[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void simplemap_adff_sdff(RTLIL::Module *module, RTLIL::Cell *cell)
|
||||||
|
{
|
||||||
|
int width = cell->parameters.at(ID::WIDTH).as_int();
|
||||||
|
bool is_async = cell->type == ID($adff);
|
||||||
|
char clk_pol = cell->parameters.at(ID::CLK_POLARITY).as_bool() ? 'P' : 'N';
|
||||||
|
char rst_pol = cell->parameters.at(is_async ? ID::ARST_POLARITY : ID::SRST_POLARITY).as_bool() ? 'P' : 'N';
|
||||||
|
const char *type = is_async ? "DFF" : "SDFF";
|
||||||
|
|
||||||
|
std::vector<RTLIL::State> rst_val = cell->parameters.at(is_async ? ID::ARST_VALUE : ID::SRST_VALUE).bits;
|
||||||
while (int(rst_val.size()) < width)
|
while (int(rst_val.size()) < width)
|
||||||
rst_val.push_back(RTLIL::State::S0);
|
rst_val.push_back(RTLIL::State::S0);
|
||||||
|
|
||||||
RTLIL::SigSpec sig_clk = cell->getPort(ID::CLK);
|
RTLIL::SigSpec sig_clk = cell->getPort(ID::CLK);
|
||||||
RTLIL::SigSpec sig_rst = cell->getPort(ID::ARST);
|
RTLIL::SigSpec sig_rst = cell->getPort(is_async ? ID::ARST : ID::SRST);
|
||||||
RTLIL::SigSpec sig_d = cell->getPort(ID::D);
|
RTLIL::SigSpec sig_d = cell->getPort(ID::D);
|
||||||
RTLIL::SigSpec sig_q = cell->getPort(ID::Q);
|
RTLIL::SigSpec sig_q = cell->getPort(ID::Q);
|
||||||
|
|
||||||
IdString gate_type_0 = stringf("$_DFF_%c%c0_", clk_pol, rst_pol);
|
IdString gate_type_0 = stringf("$_%s_%c%c0_", type, clk_pol, rst_pol);
|
||||||
IdString gate_type_1 = stringf("$_DFF_%c%c1_", clk_pol, rst_pol);
|
IdString gate_type_1 = stringf("$_%s_%c%c1_", type, clk_pol, rst_pol);
|
||||||
|
|
||||||
for (int i = 0; i < width; i++) {
|
for (int i = 0; i < width; i++) {
|
||||||
RTLIL::Cell *gate = module->addCell(NEW_ID, rst_val.at(i) == RTLIL::State::S1 ? gate_type_1 : gate_type_0);
|
RTLIL::Cell *gate = module->addCell(NEW_ID, rst_val.at(i) == RTLIL::State::S1 ? gate_type_1 : gate_type_0);
|
||||||
|
@ -502,6 +533,39 @@ void simplemap_adff(RTLIL::Module *module, RTLIL::Cell *cell)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void simplemap_adffe_sdffe_sdffce(RTLIL::Module *module, RTLIL::Cell *cell)
|
||||||
|
{
|
||||||
|
int width = cell->parameters.at(ID::WIDTH).as_int();
|
||||||
|
bool is_async = cell->type == ID($adffe);
|
||||||
|
char clk_pol = cell->parameters.at(ID::CLK_POLARITY).as_bool() ? 'P' : 'N';
|
||||||
|
char rst_pol = cell->parameters.at(is_async ? ID::ARST_POLARITY : ID::SRST_POLARITY).as_bool() ? 'P' : 'N';
|
||||||
|
char en_pol = cell->parameters.at(ID::EN_POLARITY).as_bool() ? 'P' : 'N';
|
||||||
|
const char *type = is_async ? "DFFE" : cell->type == ID($sdffe) ? "SDFFE" : "SDFFCE";
|
||||||
|
|
||||||
|
std::vector<RTLIL::State> rst_val = cell->parameters.at(is_async ? ID::ARST_VALUE : ID::SRST_VALUE).bits;
|
||||||
|
while (int(rst_val.size()) < width)
|
||||||
|
rst_val.push_back(RTLIL::State::S0);
|
||||||
|
|
||||||
|
RTLIL::SigSpec sig_clk = cell->getPort(ID::CLK);
|
||||||
|
RTLIL::SigSpec sig_rst = cell->getPort(is_async ? ID::ARST : ID::SRST);
|
||||||
|
RTLIL::SigSpec sig_e = cell->getPort(ID::EN);
|
||||||
|
RTLIL::SigSpec sig_d = cell->getPort(ID::D);
|
||||||
|
RTLIL::SigSpec sig_q = cell->getPort(ID::Q);
|
||||||
|
|
||||||
|
IdString gate_type_0 = stringf("$_%s_%c%c0%c_", type, clk_pol, rst_pol, en_pol);
|
||||||
|
IdString gate_type_1 = stringf("$_%s_%c%c1%c_", type, clk_pol, rst_pol, en_pol);
|
||||||
|
|
||||||
|
for (int i = 0; i < width; i++) {
|
||||||
|
RTLIL::Cell *gate = module->addCell(NEW_ID, rst_val.at(i) == RTLIL::State::S1 ? gate_type_1 : gate_type_0);
|
||||||
|
gate->add_strpool_attribute(ID::src, cell->get_strpool_attribute(ID::src));
|
||||||
|
gate->setPort(ID::C, sig_clk);
|
||||||
|
gate->setPort(ID::R, sig_rst);
|
||||||
|
gate->setPort(ID::E, sig_e);
|
||||||
|
gate->setPort(ID::D, sig_d[i]);
|
||||||
|
gate->setPort(ID::Q, sig_q[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void simplemap_dlatch(RTLIL::Module *module, RTLIL::Cell *cell)
|
void simplemap_dlatch(RTLIL::Module *module, RTLIL::Cell *cell)
|
||||||
{
|
{
|
||||||
int width = cell->parameters.at(ID::WIDTH).as_int();
|
int width = cell->parameters.at(ID::WIDTH).as_int();
|
||||||
|
@ -522,6 +586,60 @@ void simplemap_dlatch(RTLIL::Module *module, RTLIL::Cell *cell)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void simplemap_adlatch(RTLIL::Module *module, RTLIL::Cell *cell)
|
||||||
|
{
|
||||||
|
int width = cell->parameters.at(ID::WIDTH).as_int();
|
||||||
|
char en_pol = cell->parameters.at(ID::EN_POLARITY).as_bool() ? 'P' : 'N';
|
||||||
|
char rst_pol = cell->parameters.at(ID::ARST_POLARITY).as_bool() ? 'P' : 'N';
|
||||||
|
|
||||||
|
std::vector<RTLIL::State> rst_val = cell->parameters.at(ID::ARST_VALUE).bits;
|
||||||
|
while (int(rst_val.size()) < width)
|
||||||
|
rst_val.push_back(RTLIL::State::S0);
|
||||||
|
|
||||||
|
RTLIL::SigSpec sig_en = cell->getPort(ID::EN);
|
||||||
|
RTLIL::SigSpec sig_rst = cell->getPort(ID::ARST);
|
||||||
|
RTLIL::SigSpec sig_d = cell->getPort(ID::D);
|
||||||
|
RTLIL::SigSpec sig_q = cell->getPort(ID::Q);
|
||||||
|
|
||||||
|
IdString gate_type_0 = stringf("$_DLATCH_%c%c0_", en_pol, rst_pol);
|
||||||
|
IdString gate_type_1 = stringf("$_DLATCH_%c%c1_", en_pol, rst_pol);
|
||||||
|
|
||||||
|
for (int i = 0; i < width; i++) {
|
||||||
|
RTLIL::Cell *gate = module->addCell(NEW_ID, rst_val.at(i) == RTLIL::State::S1 ? gate_type_1 : gate_type_0);
|
||||||
|
gate->add_strpool_attribute(ID::src, cell->get_strpool_attribute(ID::src));
|
||||||
|
gate->setPort(ID::E, sig_en);
|
||||||
|
gate->setPort(ID::R, sig_rst);
|
||||||
|
gate->setPort(ID::D, sig_d[i]);
|
||||||
|
gate->setPort(ID::Q, sig_q[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void simplemap_dlatchsr(RTLIL::Module *module, RTLIL::Cell *cell)
|
||||||
|
{
|
||||||
|
int width = cell->parameters.at(ID::WIDTH).as_int();
|
||||||
|
char en_pol = cell->parameters.at(ID::EN_POLARITY).as_bool() ? 'P' : 'N';
|
||||||
|
char set_pol = cell->parameters.at(ID::SET_POLARITY).as_bool() ? 'P' : 'N';
|
||||||
|
char clr_pol = cell->parameters.at(ID::CLR_POLARITY).as_bool() ? 'P' : 'N';
|
||||||
|
|
||||||
|
RTLIL::SigSpec sig_en = cell->getPort(ID::EN);
|
||||||
|
RTLIL::SigSpec sig_s = cell->getPort(ID::SET);
|
||||||
|
RTLIL::SigSpec sig_r = cell->getPort(ID::CLR);
|
||||||
|
RTLIL::SigSpec sig_d = cell->getPort(ID::D);
|
||||||
|
RTLIL::SigSpec sig_q = cell->getPort(ID::Q);
|
||||||
|
|
||||||
|
IdString gate_type = stringf("$_DLATCHSR_%c%c%c_", en_pol, set_pol, clr_pol);
|
||||||
|
|
||||||
|
for (int i = 0; i < width; i++) {
|
||||||
|
RTLIL::Cell *gate = module->addCell(NEW_ID, gate_type);
|
||||||
|
gate->add_strpool_attribute(ID::src, cell->get_strpool_attribute(ID::src));
|
||||||
|
gate->setPort(ID::E, sig_en);
|
||||||
|
gate->setPort(ID::S, sig_s[i]);
|
||||||
|
gate->setPort(ID::R, sig_r[i]);
|
||||||
|
gate->setPort(ID::D, sig_d[i]);
|
||||||
|
gate->setPort(ID::Q, sig_q[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void simplemap_get_mappers(dict<IdString, void(*)(RTLIL::Module*, RTLIL::Cell*)> &mappers)
|
void simplemap_get_mappers(dict<IdString, void(*)(RTLIL::Module*, RTLIL::Cell*)> &mappers)
|
||||||
{
|
{
|
||||||
mappers[ID($not)] = simplemap_not;
|
mappers[ID($not)] = simplemap_not;
|
||||||
|
@ -553,8 +671,15 @@ void simplemap_get_mappers(dict<IdString, void(*)(RTLIL::Module*, RTLIL::Cell*)>
|
||||||
mappers[ID($dff)] = simplemap_dff;
|
mappers[ID($dff)] = simplemap_dff;
|
||||||
mappers[ID($dffe)] = simplemap_dffe;
|
mappers[ID($dffe)] = simplemap_dffe;
|
||||||
mappers[ID($dffsr)] = simplemap_dffsr;
|
mappers[ID($dffsr)] = simplemap_dffsr;
|
||||||
mappers[ID($adff)] = simplemap_adff;
|
mappers[ID($dffsre)] = simplemap_dffsre;
|
||||||
|
mappers[ID($adff)] = simplemap_adff_sdff;
|
||||||
|
mappers[ID($sdff)] = simplemap_adff_sdff;
|
||||||
|
mappers[ID($adffe)] = simplemap_adffe_sdffe_sdffce;
|
||||||
|
mappers[ID($sdffe)] = simplemap_adffe_sdffe_sdffce;
|
||||||
|
mappers[ID($sdffce)] = simplemap_adffe_sdffe_sdffce;
|
||||||
mappers[ID($dlatch)] = simplemap_dlatch;
|
mappers[ID($dlatch)] = simplemap_dlatch;
|
||||||
|
mappers[ID($adlatch)] = simplemap_adlatch;
|
||||||
|
mappers[ID($dlatchsr)] = simplemap_dlatchsr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void simplemap(RTLIL::Module *module, RTLIL::Cell *cell)
|
void simplemap(RTLIL::Module *module, RTLIL::Cell *cell)
|
||||||
|
@ -587,7 +712,7 @@ struct SimplemapPass : public Pass {
|
||||||
log(" $not, $pos, $and, $or, $xor, $xnor\n");
|
log(" $not, $pos, $and, $or, $xor, $xnor\n");
|
||||||
log(" $reduce_and, $reduce_or, $reduce_xor, $reduce_xnor, $reduce_bool\n");
|
log(" $reduce_and, $reduce_or, $reduce_xor, $reduce_xnor, $reduce_bool\n");
|
||||||
log(" $logic_not, $logic_and, $logic_or, $mux, $tribuf\n");
|
log(" $logic_not, $logic_and, $logic_or, $mux, $tribuf\n");
|
||||||
log(" $sr, $ff, $dff, $dffsr, $adff, $dlatch\n");
|
log(" $sr, $ff, $dff, $dffe, $dffsr, $dffsre, $adff, $adffe, $sdff, $sdffe, $sdffce, $dlatch, $adlatch, $dlatchsr\n");
|
||||||
log("\n");
|
log("\n");
|
||||||
}
|
}
|
||||||
void execute(std::vector<std::string> args, RTLIL::Design *design) override
|
void execute(std::vector<std::string> args, RTLIL::Design *design) override
|
||||||
|
|
|
@ -91,20 +91,29 @@ struct ZinitPass : public Pass {
|
||||||
// FIXME: It would appear that supporting
|
// FIXME: It would appear that supporting
|
||||||
// $dffsr/$_DFFSR_* would require a new
|
// $dffsr/$_DFFSR_* would require a new
|
||||||
// cell type where S has priority over R
|
// cell type where S has priority over R
|
||||||
ID($ff), ID($dff), ID($dffe), /*ID($dffsr),*/ ID($adff),
|
ID($ff), ID($dff), ID($dffe), /*ID($dffsr),*/ ID($adff), ID($adffe),
|
||||||
|
ID($sdff), ID($sdffe), ID($sdffce),
|
||||||
ID($_FF_), ID($_DFFE_NN_), ID($_DFFE_NP_), ID($_DFFE_PN_), ID($_DFFE_PP_),
|
ID($_FF_), ID($_DFFE_NN_), ID($_DFFE_NP_), ID($_DFFE_PN_), ID($_DFFE_PP_),
|
||||||
/*ID($_DFFSR_NNN_), ID($_DFFSR_NNP_), ID($_DFFSR_NPN_), ID($_DFFSR_NPP_),
|
/*ID($_DFFSR_NNN_), ID($_DFFSR_NNP_), ID($_DFFSR_NPN_), ID($_DFFSR_NPP_),
|
||||||
ID($_DFFSR_PNN_), ID($_DFFSR_PNP_), ID($_DFFSR_PPN_), ID($_DFFSR_PPP_),*/
|
ID($_DFFSR_PNN_), ID($_DFFSR_PNP_), ID($_DFFSR_PPN_), ID($_DFFSR_PPP_),*/
|
||||||
ID($_DFF_N_), ID($_DFF_NN0_), ID($_DFF_NN1_), ID($_DFF_NP0_), ID($_DFF_NP1_),
|
ID($_DFF_N_), ID($_DFF_NN0_), ID($_DFF_NN1_), ID($_DFF_NP0_), ID($_DFF_NP1_),
|
||||||
ID($_DFF_P_), ID($_DFF_PN0_), ID($_DFF_PN1_), ID($_DFF_PP0_), ID($_DFF_PP1_),
|
ID($_DFF_P_), ID($_DFF_PN0_), ID($_DFF_PN1_), ID($_DFF_PP0_), ID($_DFF_PP1_),
|
||||||
// Async set/reset
|
// Async set/reset
|
||||||
ID($__DFFE_NN0), ID($__DFFE_NN1), ID($__DFFE_NP0), ID($__DFFE_NP1),
|
ID($_DFFE_NN0P_), ID($_DFFE_NN1P_), ID($_DFFE_NP0P_), ID($_DFFE_NP1P_),
|
||||||
ID($__DFFE_PN0), ID($__DFFE_PN1), ID($__DFFE_PP0), ID($__DFFE_PP1),
|
ID($_DFFE_PN0P_), ID($_DFFE_PN1P_), ID($_DFFE_PP0P_), ID($_DFFE_PP1P_),
|
||||||
|
ID($_DFFE_NN0N_), ID($_DFFE_NN1N_), ID($_DFFE_NP0N_), ID($_DFFE_NP1N_),
|
||||||
|
ID($_DFFE_PN0N_), ID($_DFFE_PN1N_), ID($_DFFE_PP0N_), ID($_DFFE_PP1N_),
|
||||||
// Sync set/reset
|
// Sync set/reset
|
||||||
ID($__DFFS_NN0_), ID($__DFFS_NN1_), ID($__DFFS_NP0_), ID($__DFFS_NP1_),
|
ID($_SDFF_NN0_), ID($_SDFF_NN1_), ID($_SDFF_NP0_), ID($_SDFF_NP1_),
|
||||||
ID($__DFFS_PN0_), ID($__DFFS_PN1_), ID($__DFFS_PP0_), ID($__DFFS_PP1_),
|
ID($_SDFF_PN0_), ID($_SDFF_PN1_), ID($_SDFF_PP0_), ID($_SDFF_PP1_),
|
||||||
ID($__DFFSE_NN0), ID($__DFFSE_NN1), ID($__DFFSE_NP0), ID($__DFFSE_NP1),
|
ID($_SDFFE_NN0P_), ID($_SDFFE_NN1P_), ID($_SDFFE_NP0P_), ID($_SDFFE_NP1P_),
|
||||||
ID($__DFFSE_PN0), ID($__DFFSE_PN1), ID($__DFFSE_PP0), ID($__DFFSE_PP1)
|
ID($_SDFFE_PN0P_), ID($_SDFFE_PN1P_), ID($_SDFFE_PP0P_), ID($_SDFFE_PP1P_),
|
||||||
|
ID($_SDFFE_NN0N_), ID($_SDFFE_NN1N_), ID($_SDFFE_NP0N_), ID($_SDFFE_NP1N_),
|
||||||
|
ID($_SDFFE_PN0N_), ID($_SDFFE_PN1N_), ID($_SDFFE_PP0N_), ID($_SDFFE_PP1N_),
|
||||||
|
ID($_SDFFCE_NN0P_), ID($_SDFFCE_NN1P_), ID($_SDFFCE_NP0P_), ID($_SDFFCE_NP1P_),
|
||||||
|
ID($_SDFFCE_PN0P_), ID($_SDFFCE_PN1P_), ID($_SDFFCE_PP0P_), ID($_SDFFCE_PP1P_),
|
||||||
|
ID($_SDFFCE_NN0N_), ID($_SDFFCE_NN1N_), ID($_SDFFCE_NP0N_), ID($_SDFFCE_NP1N_),
|
||||||
|
ID($_SDFFCE_PN0N_), ID($_SDFFCE_PN1N_), ID($_SDFFCE_PP0N_), ID($_SDFFCE_PP1N_)
|
||||||
};
|
};
|
||||||
|
|
||||||
for (auto cell : module->selected_cells())
|
for (auto cell : module->selected_cells())
|
||||||
|
@ -151,13 +160,20 @@ struct ZinitPass : public Pass {
|
||||||
cell->setPort(ID::D, sig_d);
|
cell->setPort(ID::D, sig_d);
|
||||||
cell->setPort(ID::Q, initwire);
|
cell->setPort(ID::Q, initwire);
|
||||||
|
|
||||||
if (cell->type == ID($adff)) {
|
if (cell->type.in(ID($adff), ID($adffe))) {
|
||||||
auto val = cell->getParam(ID::ARST_VALUE);
|
auto val = cell->getParam(ID::ARST_VALUE);
|
||||||
for (int i = 0; i < GetSize(initwire); i++)
|
for (int i = 0; i < GetSize(initwire); i++)
|
||||||
if (initval[i] == State::S1)
|
if (initval[i] == State::S1)
|
||||||
val[i] = (val[i] == State::S1 ? State::S0 : State::S1);
|
val[i] = (val[i] == State::S1 ? State::S0 : State::S1);
|
||||||
cell->setParam(ID::ARST_VALUE, std::move(val));
|
cell->setParam(ID::ARST_VALUE, std::move(val));
|
||||||
}
|
}
|
||||||
|
else if (cell->type.in(ID($sdff), ID($sdffe), ID($sdffce))) {
|
||||||
|
auto val = cell->getParam(ID::SRST_VALUE);
|
||||||
|
for (int i = 0; i < GetSize(initwire); i++)
|
||||||
|
if (initval[i] == State::S1)
|
||||||
|
val[i] = (val[i] == State::S1 ? State::S0 : State::S1);
|
||||||
|
cell->setParam(ID::SRST_VALUE, std::move(val));
|
||||||
|
}
|
||||||
else if (initval == State::S1) {
|
else if (initval == State::S1) {
|
||||||
std::string t = cell->type.str();
|
std::string t = cell->type.str();
|
||||||
if (cell->type.in(ID($_DFF_NN0_), ID($_DFF_NN1_), ID($_DFF_NP0_), ID($_DFF_NP1_),
|
if (cell->type.in(ID($_DFF_NN0_), ID($_DFF_NN1_), ID($_DFF_NP0_), ID($_DFF_NP1_),
|
||||||
|
@ -165,15 +181,29 @@ struct ZinitPass : public Pass {
|
||||||
{
|
{
|
||||||
t[8] = (t[8] == '0' ? '1' : '0');
|
t[8] = (t[8] == '0' ? '1' : '0');
|
||||||
}
|
}
|
||||||
else if (cell->type.in(ID($__DFFE_NN0), ID($__DFFE_NN1), ID($__DFFE_NP0), ID($__DFFE_NP1),
|
else if (cell->type.in(ID($_SDFF_NN0_), ID($_SDFF_NN1_), ID($_SDFF_NP0_), ID($_SDFF_NP1_),
|
||||||
ID($__DFFE_PN0), ID($__DFFE_PN1), ID($__DFFE_PP0), ID($__DFFE_PP1),
|
ID($_SDFF_PN0_), ID($_SDFF_PN1_), ID($_SDFF_PP0_), ID($_SDFF_PP1_)))
|
||||||
ID($__DFFS_NN0_), ID($__DFFS_NN1_), ID($__DFFS_NP0_), ID($__DFFS_NP1_),
|
{
|
||||||
ID($__DFFS_PN0_), ID($__DFFS_PN1_), ID($__DFFS_PP0_), ID($__DFFS_PP1_)))
|
t[9] = (t[9] == '0' ? '1' : '0');
|
||||||
|
}
|
||||||
|
else if (cell->type.in(ID($_DFFE_NN0P_), ID($_DFFE_NN1P_), ID($_DFFE_NP0P_), ID($_DFFE_NP1P_),
|
||||||
|
ID($_DFFE_PN0P_), ID($_DFFE_PN1P_), ID($_DFFE_PP0P_), ID($_DFFE_PP1P_),
|
||||||
|
ID($_DFFE_NN0N_), ID($_DFFE_NN1N_), ID($_DFFE_NP0N_), ID($_DFFE_NP1N_),
|
||||||
|
ID($_DFFE_PN0N_), ID($_DFFE_PN1N_), ID($_DFFE_PP0N_), ID($_DFFE_PP1N_)))
|
||||||
|
{
|
||||||
|
t[9] = (t[9] == '0' ? '1' : '0');
|
||||||
|
}
|
||||||
|
else if (cell->type.in(ID($_SDFFE_NN0P_), ID($_SDFFE_NN1P_), ID($_SDFFE_NP0P_), ID($_SDFFE_NP1P_),
|
||||||
|
ID($_SDFFE_PN0P_), ID($_SDFFE_PN1P_), ID($_SDFFE_PP0P_), ID($_SDFFE_PP1P_),
|
||||||
|
ID($_SDFFE_NN0N_), ID($_SDFFE_NN1N_), ID($_SDFFE_NP0N_), ID($_SDFFE_NP1N_),
|
||||||
|
ID($_SDFFE_PN0N_), ID($_SDFFE_PN1N_), ID($_SDFFE_PP0N_), ID($_SDFFE_PP1N_)))
|
||||||
{
|
{
|
||||||
t[10] = (t[10] == '0' ? '1' : '0');
|
t[10] = (t[10] == '0' ? '1' : '0');
|
||||||
}
|
}
|
||||||
else if (cell->type.in(ID($__DFFSE_NN0), ID($__DFFSE_NN1), ID($__DFFSE_NP0), ID($__DFFSE_NP1),
|
else if (cell->type.in(ID($_SDFFCE_NN0P_), ID($_SDFFCE_NN1P_), ID($_SDFFCE_NP0P_), ID($_SDFFCE_NP1P_),
|
||||||
ID($__DFFSE_PN0), ID($__DFFSE_PN1), ID($__DFFSE_PP0), ID($__DFFSE_PP1)))
|
ID($_SDFFCE_PN0P_), ID($_SDFFCE_PN1P_), ID($_SDFFCE_PP0P_), ID($_SDFFCE_PP1P_),
|
||||||
|
ID($_SDFFCE_NN0N_), ID($_SDFFCE_NN1N_), ID($_SDFFCE_NP0N_), ID($_SDFFCE_NP1N_),
|
||||||
|
ID($_SDFFCE_PN0N_), ID($_SDFFCE_PN1N_), ID($_SDFFCE_PP0N_), ID($_SDFFCE_PP1N_)))
|
||||||
{
|
{
|
||||||
t[11] = (t[11] == '0' ? '1' : '0');
|
t[11] = (t[11] == '0' ? '1' : '0');
|
||||||
}
|
}
|
||||||
|
|
|
@ -108,6 +108,31 @@ endmodule
|
||||||
"""
|
"""
|
||||||
// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
|
// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
|
||||||
//-
|
//-
|
||||||
|
//- $_DFFE_{C:N|P}{R:N|P}{V:0|1}{E:N|P}_ (D, C, R, E, Q)
|
||||||
|
//-
|
||||||
|
//- A {C:negative|positive} edge D-type flip-flop with {R:negative|positive} polarity {V:reset|set} and {E:negative|positive}
|
||||||
|
//- polarity clock enable.
|
||||||
|
//-
|
||||||
|
//- Truth table: D C R E | Q
|
||||||
|
//- ---------+---
|
||||||
|
//- - - {R:0|1} - | {V:0|1}
|
||||||
|
//- d {C:\\|/} - {E:0|1} | d
|
||||||
|
//- - - - - | q
|
||||||
|
//-
|
||||||
|
module \$_DFFE_{C:N|P}{R:N|P}{V:0|1}{E:N|P}_ (D, C, R, E, Q);
|
||||||
|
input D, C, R, E;
|
||||||
|
output reg Q;
|
||||||
|
always @({C:neg|pos}edge C or {R:neg|pos}edge R) begin
|
||||||
|
if (R == {R:0|1})
|
||||||
|
Q <= {V:0|1};
|
||||||
|
else if (E == {E:0|1})
|
||||||
|
Q <= D;
|
||||||
|
end
|
||||||
|
endmodule
|
||||||
|
""",
|
||||||
|
"""
|
||||||
|
// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
|
||||||
|
//-
|
||||||
//- $_DFFSR_{C:N|P}{S:N|P}{R:N|P}_ (C, S, R, D, Q)
|
//- $_DFFSR_{C:N|P}{S:N|P}{R:N|P}_ (C, S, R, D, Q)
|
||||||
//-
|
//-
|
||||||
//- A {C:negative|positive} edge D-type flip-flop with {S:negative|positive} polarity set and {R:negative|positive}
|
//- A {C:negative|positive} edge D-type flip-flop with {S:negative|positive} polarity set and {R:negative|positive}
|
||||||
|
@ -136,6 +161,110 @@ endmodule
|
||||||
"""
|
"""
|
||||||
// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
|
// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
|
||||||
//-
|
//-
|
||||||
|
//- $_DFFSRE_{C:N|P}{S:N|P}{R:N|P}{E:N|P}_ (C, S, R, E, D, Q)
|
||||||
|
//-
|
||||||
|
//- A {C:negative|positive} edge D-type flip-flop with {S:negative|positive} polarity set, {R:negative|positive}
|
||||||
|
//- polarity reset and {E:negative|positive} polarity clock enable.
|
||||||
|
//-
|
||||||
|
//- Truth table: C S R E D | Q
|
||||||
|
//- -----------+---
|
||||||
|
//- - - {R:0|1} - - | 0
|
||||||
|
//- - {S:0|1} - - - | 1
|
||||||
|
//- {C:\\|/} - - {E:0|1} d | d
|
||||||
|
//- - - - - - | q
|
||||||
|
//-
|
||||||
|
module \$_DFFSRE_{C:N|P}{S:N|P}{R:N|P}{E:N|P}_ (C, S, R, E, D, Q);
|
||||||
|
input C, S, R, E, D;
|
||||||
|
output reg Q;
|
||||||
|
always @({C:neg|pos}edge C, {S:neg|pos}edge S, {R:neg|pos}edge R) begin
|
||||||
|
if (R == {R:0|1})
|
||||||
|
Q <= 0;
|
||||||
|
else if (S == {S:0|1})
|
||||||
|
Q <= 1;
|
||||||
|
else if (E == {E:0|1})
|
||||||
|
Q <= D;
|
||||||
|
end
|
||||||
|
endmodule
|
||||||
|
""",
|
||||||
|
"""
|
||||||
|
// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
|
||||||
|
//-
|
||||||
|
//- $_SDFF_{C:N|P}{R:N|P}{V:0|1}_ (D, C, R, Q)
|
||||||
|
//-
|
||||||
|
//- A {C:negative|positive} edge D-type flip-flop with {R:negative|positive} polarity synchronous {V:reset|set}.
|
||||||
|
//-
|
||||||
|
//- Truth table: D C R | Q
|
||||||
|
//- -------+---
|
||||||
|
//- - {C:\\|/} {R:0|1} | {V:0|1}
|
||||||
|
//- d {C:\\|/} - | d
|
||||||
|
//- - - - | q
|
||||||
|
//-
|
||||||
|
module \$_SDFF_{C:N|P}{R:N|P}{V:0|1}_ (D, C, R, Q);
|
||||||
|
input D, C, R;
|
||||||
|
output reg Q;
|
||||||
|
always @({C:neg|pos}edge C) begin
|
||||||
|
if (R == {R:0|1})
|
||||||
|
Q <= {V:0|1};
|
||||||
|
else
|
||||||
|
Q <= D;
|
||||||
|
end
|
||||||
|
endmodule
|
||||||
|
""",
|
||||||
|
"""
|
||||||
|
// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
|
||||||
|
//-
|
||||||
|
//- $_SDFFE_{C:N|P}{R:N|P}{V:0|1}{E:N|P}_ (D, C, R, E, Q)
|
||||||
|
//-
|
||||||
|
//- A {C:negative|positive} edge D-type flip-flop with {R:negative|positive} polarity synchronous {V:reset|set} and {E:negative|positive}
|
||||||
|
//- polarity clock enable (with {V:reset|set} having priority).
|
||||||
|
//-
|
||||||
|
//- Truth table: D C R E | Q
|
||||||
|
//- ---------+---
|
||||||
|
//- - {C:\\|/} {R:0|1} - | {V:0|1}
|
||||||
|
//- d {C:\\|/} - {E:0|1} | d
|
||||||
|
//- - - - - | q
|
||||||
|
//-
|
||||||
|
module \$_SDFFE_{C:N|P}{R:N|P}{V:0|1}{E:N|P}_ (D, C, R, E, Q);
|
||||||
|
input D, C, R, E;
|
||||||
|
output reg Q;
|
||||||
|
always @({C:neg|pos}edge C) begin
|
||||||
|
if (R == {R:0|1})
|
||||||
|
Q <= {V:0|1};
|
||||||
|
else if (E == {E:0|1})
|
||||||
|
Q <= D;
|
||||||
|
end
|
||||||
|
endmodule
|
||||||
|
""",
|
||||||
|
"""
|
||||||
|
// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
|
||||||
|
//-
|
||||||
|
//- $_SDFFCE_{C:N|P}{R:N|P}{V:0|1}{E:N|P}_ (D, C, R, E, Q)
|
||||||
|
//-
|
||||||
|
//- A {C:negative|positive} edge D-type flip-flop with {R:negative|positive} polarity synchronous {V:reset|set} and {E:negative|positive}
|
||||||
|
//- polarity clock enable (with clock enable having priority).
|
||||||
|
//-
|
||||||
|
//- Truth table: D C R E | Q
|
||||||
|
//- ---------+---
|
||||||
|
//- - {C:\\|/} {R:0|1} {E:0|1} | {V:0|1}
|
||||||
|
//- d {C:\\|/} - {E:0|1} | d
|
||||||
|
//- - - - - | q
|
||||||
|
//-
|
||||||
|
module \$_SDFFCE_{C:N|P}{R:N|P}{V:0|1}{E:N|P}_ (D, C, R, E, Q);
|
||||||
|
input D, C, R, E;
|
||||||
|
output reg Q;
|
||||||
|
always @({C:neg|pos}edge C) begin
|
||||||
|
if (E == {E:0|1}) begin
|
||||||
|
if (R == {R:0|1})
|
||||||
|
Q <= {V:0|1};
|
||||||
|
else
|
||||||
|
Q <= D;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
endmodule
|
||||||
|
""",
|
||||||
|
"""
|
||||||
|
// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
|
||||||
|
//-
|
||||||
//- $_DLATCH_{E:N|P}_ (E, D, Q)
|
//- $_DLATCH_{E:N|P}_ (E, D, Q)
|
||||||
//-
|
//-
|
||||||
//- A {E:negative|positive} enable D-type latch.
|
//- A {E:negative|positive} enable D-type latch.
|
||||||
|
@ -157,6 +286,30 @@ endmodule
|
||||||
"""
|
"""
|
||||||
// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
|
// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
|
||||||
//-
|
//-
|
||||||
|
//- $_DLATCH_{E:N|P}{R:N|P}{V:0|1}_ (E, R, D, Q)
|
||||||
|
//-
|
||||||
|
//- A {E:negative|positive} enable D-type latch with {R:negative|positive} polarity {V:reset|set}.
|
||||||
|
//-
|
||||||
|
//- Truth table: E R D | Q
|
||||||
|
//- -------+---
|
||||||
|
//- - {R:0|1} - | {V:0|1}
|
||||||
|
//- {E:0|1} - d | d
|
||||||
|
//- - - - | q
|
||||||
|
//-
|
||||||
|
module \$_DLATCH_{E:N|P}{R:N|P}{V:0|1}_ (E, R, D, Q);
|
||||||
|
input E, R, D;
|
||||||
|
output reg Q;
|
||||||
|
always @* begin
|
||||||
|
if (R == {E:0|1})
|
||||||
|
Q <= {V:0|1};
|
||||||
|
else if (E == {E:0|1})
|
||||||
|
Q <= D;
|
||||||
|
end
|
||||||
|
endmodule
|
||||||
|
""",
|
||||||
|
"""
|
||||||
|
// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
|
||||||
|
//-
|
||||||
//- $_DLATCHSR_{E:N|P}{S:N|P}{R:N|P}_ (E, S, R, D, Q)
|
//- $_DLATCHSR_{E:N|P}{S:N|P}{R:N|P}_ (E, S, R, D, Q)
|
||||||
//-
|
//-
|
||||||
//- A {E:negative|positive} enable D-type latch with {S:negative|positive} polarity set and {R:negative|positive}
|
//- A {E:negative|positive} enable D-type latch with {S:negative|positive} polarity set and {R:negative|positive}
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1822,6 +1822,39 @@ endgenerate
|
||||||
|
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
|
// --------------------------------------------------------
|
||||||
|
|
||||||
|
module \$dffsre (CLK, SET, CLR, EN, D, Q);
|
||||||
|
|
||||||
|
parameter WIDTH = 0;
|
||||||
|
parameter CLK_POLARITY = 1'b1;
|
||||||
|
parameter SET_POLARITY = 1'b1;
|
||||||
|
parameter CLR_POLARITY = 1'b1;
|
||||||
|
parameter EN_POLARITY = 1'b1;
|
||||||
|
|
||||||
|
input CLK, EN;
|
||||||
|
input [WIDTH-1:0] SET, CLR, D;
|
||||||
|
output reg [WIDTH-1:0] Q;
|
||||||
|
|
||||||
|
wire pos_clk = CLK == CLK_POLARITY;
|
||||||
|
wire [WIDTH-1:0] pos_set = SET_POLARITY ? SET : ~SET;
|
||||||
|
wire [WIDTH-1:0] pos_clr = CLR_POLARITY ? CLR : ~CLR;
|
||||||
|
|
||||||
|
genvar i;
|
||||||
|
generate
|
||||||
|
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;
|
||||||
|
else if (pos_set[i])
|
||||||
|
Q[i] <= 1;
|
||||||
|
else if (EN == EN_POLARITY)
|
||||||
|
Q[i] <= D[i];
|
||||||
|
end
|
||||||
|
endgenerate
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
||||||
`endif
|
`endif
|
||||||
// --------------------------------------------------------
|
// --------------------------------------------------------
|
||||||
|
|
||||||
|
@ -1849,6 +1882,107 @@ endmodule
|
||||||
|
|
||||||
// --------------------------------------------------------
|
// --------------------------------------------------------
|
||||||
|
|
||||||
|
module \$sdff (CLK, SRST, D, Q);
|
||||||
|
|
||||||
|
parameter WIDTH = 0;
|
||||||
|
parameter CLK_POLARITY = 1'b1;
|
||||||
|
parameter SRST_POLARITY = 1'b1;
|
||||||
|
parameter SRST_VALUE = 0;
|
||||||
|
|
||||||
|
input CLK, SRST;
|
||||||
|
input [WIDTH-1:0] D;
|
||||||
|
output reg [WIDTH-1:0] Q;
|
||||||
|
wire pos_clk = CLK == CLK_POLARITY;
|
||||||
|
wire pos_srst = SRST == SRST_POLARITY;
|
||||||
|
|
||||||
|
always @(posedge pos_clk) begin
|
||||||
|
if (pos_srst)
|
||||||
|
Q <= SRST_VALUE;
|
||||||
|
else
|
||||||
|
Q <= D;
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
// --------------------------------------------------------
|
||||||
|
|
||||||
|
module \$adffe (CLK, ARST, EN, D, Q);
|
||||||
|
|
||||||
|
parameter WIDTH = 0;
|
||||||
|
parameter CLK_POLARITY = 1'b1;
|
||||||
|
parameter EN_POLARITY = 1'b1;
|
||||||
|
parameter ARST_POLARITY = 1'b1;
|
||||||
|
parameter ARST_VALUE = 0;
|
||||||
|
|
||||||
|
input CLK, ARST, EN;
|
||||||
|
input [WIDTH-1:0] D;
|
||||||
|
output reg [WIDTH-1:0] Q;
|
||||||
|
wire pos_clk = CLK == CLK_POLARITY;
|
||||||
|
wire pos_arst = ARST == ARST_POLARITY;
|
||||||
|
|
||||||
|
always @(posedge pos_clk, posedge pos_arst) begin
|
||||||
|
if (pos_arst)
|
||||||
|
Q <= ARST_VALUE;
|
||||||
|
else if (EN == EN_POLARITY)
|
||||||
|
Q <= D;
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
// --------------------------------------------------------
|
||||||
|
|
||||||
|
module \$sdffe (CLK, SRST, EN, D, Q);
|
||||||
|
|
||||||
|
parameter WIDTH = 0;
|
||||||
|
parameter CLK_POLARITY = 1'b1;
|
||||||
|
parameter EN_POLARITY = 1'b1;
|
||||||
|
parameter SRST_POLARITY = 1'b1;
|
||||||
|
parameter SRST_VALUE = 0;
|
||||||
|
|
||||||
|
input CLK, SRST, EN;
|
||||||
|
input [WIDTH-1:0] D;
|
||||||
|
output reg [WIDTH-1:0] Q;
|
||||||
|
wire pos_clk = CLK == CLK_POLARITY;
|
||||||
|
wire pos_srst = SRST == SRST_POLARITY;
|
||||||
|
|
||||||
|
always @(posedge pos_clk) begin
|
||||||
|
if (pos_srst)
|
||||||
|
Q <= SRST_VALUE;
|
||||||
|
else if (EN == EN_POLARITY)
|
||||||
|
Q <= D;
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
// --------------------------------------------------------
|
||||||
|
|
||||||
|
module \$sdffce (CLK, SRST, EN, D, Q);
|
||||||
|
|
||||||
|
parameter WIDTH = 0;
|
||||||
|
parameter CLK_POLARITY = 1'b1;
|
||||||
|
parameter EN_POLARITY = 1'b1;
|
||||||
|
parameter SRST_POLARITY = 1'b1;
|
||||||
|
parameter SRST_VALUE = 0;
|
||||||
|
|
||||||
|
input CLK, SRST, EN;
|
||||||
|
input [WIDTH-1:0] D;
|
||||||
|
output reg [WIDTH-1:0] Q;
|
||||||
|
wire pos_clk = CLK == CLK_POLARITY;
|
||||||
|
wire pos_srst = SRST == SRST_POLARITY;
|
||||||
|
|
||||||
|
always @(posedge pos_clk) begin
|
||||||
|
if (EN == EN_POLARITY) begin
|
||||||
|
if (pos_srst)
|
||||||
|
Q <= SRST_VALUE;
|
||||||
|
else
|
||||||
|
Q <= D;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
||||||
|
// --------------------------------------------------------
|
||||||
|
|
||||||
module \$dlatch (EN, D, Q);
|
module \$dlatch (EN, D, Q);
|
||||||
|
|
||||||
parameter WIDTH = 0;
|
parameter WIDTH = 0;
|
||||||
|
@ -1865,6 +1999,28 @@ end
|
||||||
|
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
|
// --------------------------------------------------------
|
||||||
|
|
||||||
|
module \$adlatch (EN, ARST, D, Q);
|
||||||
|
|
||||||
|
parameter WIDTH = 0;
|
||||||
|
parameter EN_POLARITY = 1'b1;
|
||||||
|
parameter ARST_POLARITY = 1'b1;
|
||||||
|
parameter ARST_VALUE = 0;
|
||||||
|
|
||||||
|
input EN, ARST;
|
||||||
|
input [WIDTH-1:0] D;
|
||||||
|
output reg [WIDTH-1:0] Q;
|
||||||
|
|
||||||
|
always @* begin
|
||||||
|
if (ARST == ARST_POLARITY)
|
||||||
|
Q = ARST_VALUE;
|
||||||
|
else if (EN == EN_POLARITY)
|
||||||
|
Q = D;
|
||||||
|
end
|
||||||
|
|
||||||
|
endmodule
|
||||||
|
|
||||||
// --------------------------------------------------------
|
// --------------------------------------------------------
|
||||||
`ifndef SIMLIB_NOSR
|
`ifndef SIMLIB_NOSR
|
||||||
|
|
||||||
|
|
|
@ -64,7 +64,7 @@ module _90_simplemap_various;
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
(* techmap_simplemap *)
|
(* techmap_simplemap *)
|
||||||
(* techmap_celltype = "$sr $ff $dff $dffe $adff $dffsr $dlatch" *)
|
(* techmap_celltype = "$sr $ff $dff $dffe $adff $adffe $sdff $sdffe $sdffce $dffsr $dffsre $dlatch $adlatch $dlatchsr" *)
|
||||||
module _90_simplemap_registers;
|
module _90_simplemap_registers;
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
|
|
|
@ -17,35 +17,35 @@ module \$_DFF_NP1_ (input D, C, R, output Q); TRELLIS_FF #(.GSR("AUTO"), .CEMUX
|
||||||
module \$_DFF_PP0_ (input D, C, R, output Q); TRELLIS_FF #(.GSR("AUTO"), .CEMUX("1"), .CLKMUX("CLK"), .LSRMUX("LSR"), .REGSET("RESET"), .SRMODE("ASYNC")) _TECHMAP_REPLACE_ (.CLK(C), .LSR(R), .DI(D), .Q(Q)); endmodule
|
module \$_DFF_PP0_ (input D, C, R, output Q); TRELLIS_FF #(.GSR("AUTO"), .CEMUX("1"), .CLKMUX("CLK"), .LSRMUX("LSR"), .REGSET("RESET"), .SRMODE("ASYNC")) _TECHMAP_REPLACE_ (.CLK(C), .LSR(R), .DI(D), .Q(Q)); endmodule
|
||||||
module \$_DFF_PP1_ (input D, C, R, output Q); TRELLIS_FF #(.GSR("AUTO"), .CEMUX("1"), .CLKMUX("CLK"), .LSRMUX("LSR"), .REGSET("SET"), .SRMODE("ASYNC")) _TECHMAP_REPLACE_ (.CLK(C), .LSR(R), .DI(D), .Q(Q)); endmodule
|
module \$_DFF_PP1_ (input D, C, R, output Q); TRELLIS_FF #(.GSR("AUTO"), .CEMUX("1"), .CLKMUX("CLK"), .LSRMUX("LSR"), .REGSET("SET"), .SRMODE("ASYNC")) _TECHMAP_REPLACE_ (.CLK(C), .LSR(R), .DI(D), .Q(Q)); endmodule
|
||||||
|
|
||||||
module \$__DFFS_NN0_ (input D, C, R, output Q); TRELLIS_FF #(.GSR("AUTO"), .CEMUX("1"), .CLKMUX("INV"), .LSRMUX("LSR"), .REGSET("RESET"), .SRMODE("LSR_OVER_CE")) _TECHMAP_REPLACE_ (.CLK(C), .LSR(!R), .DI(D), .Q(Q)); endmodule
|
module \$_SDFF_NN0_ (input D, C, R, output Q); TRELLIS_FF #(.GSR("AUTO"), .CEMUX("1"), .CLKMUX("INV"), .LSRMUX("LSR"), .REGSET("RESET"), .SRMODE("LSR_OVER_CE")) _TECHMAP_REPLACE_ (.CLK(C), .LSR(!R), .DI(D), .Q(Q)); endmodule
|
||||||
module \$__DFFS_NN1_ (input D, C, R, output Q); TRELLIS_FF #(.GSR("AUTO"), .CEMUX("1"), .CLKMUX("INV"), .LSRMUX("LSR"), .REGSET("SET"), .SRMODE("LSR_OVER_CE")) _TECHMAP_REPLACE_ (.CLK(C), .LSR(!R), .DI(D), .Q(Q)); endmodule
|
module \$_SDFF_NN1_ (input D, C, R, output Q); TRELLIS_FF #(.GSR("AUTO"), .CEMUX("1"), .CLKMUX("INV"), .LSRMUX("LSR"), .REGSET("SET"), .SRMODE("LSR_OVER_CE")) _TECHMAP_REPLACE_ (.CLK(C), .LSR(!R), .DI(D), .Q(Q)); endmodule
|
||||||
module \$__DFFS_PN0_ (input D, C, R, output Q); TRELLIS_FF #(.GSR("AUTO"), .CEMUX("1"), .CLKMUX("CLK"), .LSRMUX("LSR"), .REGSET("RESET"), .SRMODE("LSR_OVER_CE")) _TECHMAP_REPLACE_ (.CLK(C), .LSR(!R), .DI(D), .Q(Q)); endmodule
|
module \$_SDFF_PN0_ (input D, C, R, output Q); TRELLIS_FF #(.GSR("AUTO"), .CEMUX("1"), .CLKMUX("CLK"), .LSRMUX("LSR"), .REGSET("RESET"), .SRMODE("LSR_OVER_CE")) _TECHMAP_REPLACE_ (.CLK(C), .LSR(!R), .DI(D), .Q(Q)); endmodule
|
||||||
module \$__DFFS_PN1_ (input D, C, R, output Q); TRELLIS_FF #(.GSR("AUTO"), .CEMUX("1"), .CLKMUX("CLK"), .LSRMUX("LSR"), .REGSET("SET"), .SRMODE("LSR_OVER_CE")) _TECHMAP_REPLACE_ (.CLK(C), .LSR(!R), .DI(D), .Q(Q)); endmodule
|
module \$_SDFF_PN1_ (input D, C, R, output Q); TRELLIS_FF #(.GSR("AUTO"), .CEMUX("1"), .CLKMUX("CLK"), .LSRMUX("LSR"), .REGSET("SET"), .SRMODE("LSR_OVER_CE")) _TECHMAP_REPLACE_ (.CLK(C), .LSR(!R), .DI(D), .Q(Q)); endmodule
|
||||||
|
|
||||||
module \$__DFFS_NP0_ (input D, C, R, output Q); TRELLIS_FF #(.GSR("AUTO"), .CEMUX("1"), .CLKMUX("INV"), .LSRMUX("LSR"), .REGSET("RESET"), .SRMODE("LSR_OVER_CE")) _TECHMAP_REPLACE_ (.CLK(C), .LSR(R), .DI(D), .Q(Q)); endmodule
|
module \$_SDFF_NP0_ (input D, C, R, output Q); TRELLIS_FF #(.GSR("AUTO"), .CEMUX("1"), .CLKMUX("INV"), .LSRMUX("LSR"), .REGSET("RESET"), .SRMODE("LSR_OVER_CE")) _TECHMAP_REPLACE_ (.CLK(C), .LSR(R), .DI(D), .Q(Q)); endmodule
|
||||||
module \$__DFFS_NP1_ (input D, C, R, output Q); TRELLIS_FF #(.GSR("AUTO"), .CEMUX("1"), .CLKMUX("INV"), .LSRMUX("LSR"), .REGSET("SET"), .SRMODE("LSR_OVER_CE")) _TECHMAP_REPLACE_ (.CLK(C), .LSR(R), .DI(D), .Q(Q)); endmodule
|
module \$_SDFF_NP1_ (input D, C, R, output Q); TRELLIS_FF #(.GSR("AUTO"), .CEMUX("1"), .CLKMUX("INV"), .LSRMUX("LSR"), .REGSET("SET"), .SRMODE("LSR_OVER_CE")) _TECHMAP_REPLACE_ (.CLK(C), .LSR(R), .DI(D), .Q(Q)); endmodule
|
||||||
module \$__DFFS_PP0_ (input D, C, R, output Q); TRELLIS_FF #(.GSR("AUTO"), .CEMUX("1"), .CLKMUX("CLK"), .LSRMUX("LSR"), .REGSET("RESET"), .SRMODE("LSR_OVER_CE")) _TECHMAP_REPLACE_ (.CLK(C), .LSR(R), .DI(D), .Q(Q)); endmodule
|
module \$_SDFF_PP0_ (input D, C, R, output Q); TRELLIS_FF #(.GSR("AUTO"), .CEMUX("1"), .CLKMUX("CLK"), .LSRMUX("LSR"), .REGSET("RESET"), .SRMODE("LSR_OVER_CE")) _TECHMAP_REPLACE_ (.CLK(C), .LSR(R), .DI(D), .Q(Q)); endmodule
|
||||||
module \$__DFFS_PP1_ (input D, C, R, output Q); TRELLIS_FF #(.GSR("AUTO"), .CEMUX("1"), .CLKMUX("CLK"), .LSRMUX("LSR"), .REGSET("SET"), .SRMODE("LSR_OVER_CE")) _TECHMAP_REPLACE_ (.CLK(C), .LSR(R), .DI(D), .Q(Q)); endmodule
|
module \$_SDFF_PP1_ (input D, C, R, output Q); TRELLIS_FF #(.GSR("AUTO"), .CEMUX("1"), .CLKMUX("CLK"), .LSRMUX("LSR"), .REGSET("SET"), .SRMODE("LSR_OVER_CE")) _TECHMAP_REPLACE_ (.CLK(C), .LSR(R), .DI(D), .Q(Q)); endmodule
|
||||||
|
|
||||||
module \$__DFFE_NN0 (input D, C, E, R, output Q); TRELLIS_FF #(.GSR("AUTO"), .CEMUX("CE"), .CLKMUX("INV"), .LSRMUX("LSR"), .REGSET("RESET"), .SRMODE("ASYNC")) _TECHMAP_REPLACE_ (.CLK(C), .CE(E), .LSR(!R), .DI(D), .Q(Q)); endmodule
|
module \$_DFFE_NN0P_ (input D, C, E, R, output Q); TRELLIS_FF #(.GSR("AUTO"), .CEMUX("CE"), .CLKMUX("INV"), .LSRMUX("LSR"), .REGSET("RESET"), .SRMODE("ASYNC")) _TECHMAP_REPLACE_ (.CLK(C), .CE(E), .LSR(!R), .DI(D), .Q(Q)); endmodule
|
||||||
module \$__DFFE_NN1 (input D, C, E, R, output Q); TRELLIS_FF #(.GSR("AUTO"), .CEMUX("CE"), .CLKMUX("INV"), .LSRMUX("LSR"), .REGSET("SET"), .SRMODE("ASYNC")) _TECHMAP_REPLACE_ (.CLK(C), .CE(E), .LSR(!R), .DI(D), .Q(Q)); endmodule
|
module \$_DFFE_NN1P_ (input D, C, E, R, output Q); TRELLIS_FF #(.GSR("AUTO"), .CEMUX("CE"), .CLKMUX("INV"), .LSRMUX("LSR"), .REGSET("SET"), .SRMODE("ASYNC")) _TECHMAP_REPLACE_ (.CLK(C), .CE(E), .LSR(!R), .DI(D), .Q(Q)); endmodule
|
||||||
module \$__DFFE_PN0 (input D, C, E, R, output Q); TRELLIS_FF #(.GSR("AUTO"), .CEMUX("CE"), .CLKMUX("CLK"), .LSRMUX("LSR"), .REGSET("RESET"), .SRMODE("ASYNC")) _TECHMAP_REPLACE_ (.CLK(C), .CE(E), .LSR(!R), .DI(D), .Q(Q)); endmodule
|
module \$_DFFE_PN0P_ (input D, C, E, R, output Q); TRELLIS_FF #(.GSR("AUTO"), .CEMUX("CE"), .CLKMUX("CLK"), .LSRMUX("LSR"), .REGSET("RESET"), .SRMODE("ASYNC")) _TECHMAP_REPLACE_ (.CLK(C), .CE(E), .LSR(!R), .DI(D), .Q(Q)); endmodule
|
||||||
module \$__DFFE_PN1 (input D, C, E, R, output Q); TRELLIS_FF #(.GSR("AUTO"), .CEMUX("CE"), .CLKMUX("CLK"), .LSRMUX("LSR"), .REGSET("SET"), .SRMODE("ASYNC")) _TECHMAP_REPLACE_ (.CLK(C), .CE(E), .LSR(!R), .DI(D), .Q(Q)); endmodule
|
module \$_DFFE_PN1P_ (input D, C, E, R, output Q); TRELLIS_FF #(.GSR("AUTO"), .CEMUX("CE"), .CLKMUX("CLK"), .LSRMUX("LSR"), .REGSET("SET"), .SRMODE("ASYNC")) _TECHMAP_REPLACE_ (.CLK(C), .CE(E), .LSR(!R), .DI(D), .Q(Q)); endmodule
|
||||||
|
|
||||||
module \$__DFFE_NP0 (input D, C, E, R, output Q); TRELLIS_FF #(.GSR("AUTO"), .CEMUX("CE"), .CLKMUX("INV"), .LSRMUX("LSR"), .REGSET("RESET"), .SRMODE("ASYNC")) _TECHMAP_REPLACE_ (.CLK(C), .CE(E), .LSR(R), .DI(D), .Q(Q)); endmodule
|
module \$_DFFE_NP0P_ (input D, C, E, R, output Q); TRELLIS_FF #(.GSR("AUTO"), .CEMUX("CE"), .CLKMUX("INV"), .LSRMUX("LSR"), .REGSET("RESET"), .SRMODE("ASYNC")) _TECHMAP_REPLACE_ (.CLK(C), .CE(E), .LSR(R), .DI(D), .Q(Q)); endmodule
|
||||||
module \$__DFFE_NP1 (input D, C, E, R, output Q); TRELLIS_FF #(.GSR("AUTO"), .CEMUX("CE"), .CLKMUX("INV"), .LSRMUX("LSR"), .REGSET("SET"), .SRMODE("ASYNC")) _TECHMAP_REPLACE_ (.CLK(C), .CE(E), .LSR(R), .DI(D), .Q(Q)); endmodule
|
module \$_DFFE_NP1P_ (input D, C, E, R, output Q); TRELLIS_FF #(.GSR("AUTO"), .CEMUX("CE"), .CLKMUX("INV"), .LSRMUX("LSR"), .REGSET("SET"), .SRMODE("ASYNC")) _TECHMAP_REPLACE_ (.CLK(C), .CE(E), .LSR(R), .DI(D), .Q(Q)); endmodule
|
||||||
module \$__DFFE_PP0 (input D, C, E, R, output Q); TRELLIS_FF #(.GSR("AUTO"), .CEMUX("CE"), .CLKMUX("CLK"), .LSRMUX("LSR"), .REGSET("RESET"), .SRMODE("ASYNC")) _TECHMAP_REPLACE_ (.CLK(C), .CE(E), .LSR(R), .DI(D), .Q(Q)); endmodule
|
module \$_DFFE_PP0P_ (input D, C, E, R, output Q); TRELLIS_FF #(.GSR("AUTO"), .CEMUX("CE"), .CLKMUX("CLK"), .LSRMUX("LSR"), .REGSET("RESET"), .SRMODE("ASYNC")) _TECHMAP_REPLACE_ (.CLK(C), .CE(E), .LSR(R), .DI(D), .Q(Q)); endmodule
|
||||||
module \$__DFFE_PP1 (input D, C, E, R, output Q); TRELLIS_FF #(.GSR("AUTO"), .CEMUX("CE"), .CLKMUX("CLK"), .LSRMUX("LSR"), .REGSET("SET"), .SRMODE("ASYNC")) _TECHMAP_REPLACE_ (.CLK(C), .CE(E), .LSR(R), .DI(D), .Q(Q)); endmodule
|
module \$_DFFE_PP1P_ (input D, C, E, R, output Q); TRELLIS_FF #(.GSR("AUTO"), .CEMUX("CE"), .CLKMUX("CLK"), .LSRMUX("LSR"), .REGSET("SET"), .SRMODE("ASYNC")) _TECHMAP_REPLACE_ (.CLK(C), .CE(E), .LSR(R), .DI(D), .Q(Q)); endmodule
|
||||||
|
|
||||||
module \$__DFFSE_NN0 (input D, C, E, R, output Q); TRELLIS_FF #(.GSR("AUTO"), .CEMUX("CE"), .CLKMUX("INV"), .LSRMUX("LSR"), .REGSET("RESET"), .SRMODE("LSR_OVER_CE")) _TECHMAP_REPLACE_ (.CLK(C), .CE(E), .LSR(!R), .DI(D), .Q(Q)); endmodule
|
module \$_SDFFE_NN0P_ (input D, C, E, R, output Q); TRELLIS_FF #(.GSR("AUTO"), .CEMUX("CE"), .CLKMUX("INV"), .LSRMUX("LSR"), .REGSET("RESET"), .SRMODE("LSR_OVER_CE")) _TECHMAP_REPLACE_ (.CLK(C), .CE(E), .LSR(!R), .DI(D), .Q(Q)); endmodule
|
||||||
module \$__DFFSE_NN1 (input D, C, E, R, output Q); TRELLIS_FF #(.GSR("AUTO"), .CEMUX("CE"), .CLKMUX("INV"), .LSRMUX("LSR"), .REGSET("SET"), .SRMODE("LSR_OVER_CE")) _TECHMAP_REPLACE_ (.CLK(C), .CE(E), .LSR(!R), .DI(D), .Q(Q)); endmodule
|
module \$_SDFFE_NN1P_ (input D, C, E, R, output Q); TRELLIS_FF #(.GSR("AUTO"), .CEMUX("CE"), .CLKMUX("INV"), .LSRMUX("LSR"), .REGSET("SET"), .SRMODE("LSR_OVER_CE")) _TECHMAP_REPLACE_ (.CLK(C), .CE(E), .LSR(!R), .DI(D), .Q(Q)); endmodule
|
||||||
module \$__DFFSE_PN0 (input D, C, E, R, output Q); TRELLIS_FF #(.GSR("AUTO"), .CEMUX("CE"), .CLKMUX("CLK"), .LSRMUX("LSR"), .REGSET("RESET"), .SRMODE("LSR_OVER_CE")) _TECHMAP_REPLACE_ (.CLK(C), .CE(E), .LSR(!R), .DI(D), .Q(Q)); endmodule
|
module \$_SDFFE_PN0P_ (input D, C, E, R, output Q); TRELLIS_FF #(.GSR("AUTO"), .CEMUX("CE"), .CLKMUX("CLK"), .LSRMUX("LSR"), .REGSET("RESET"), .SRMODE("LSR_OVER_CE")) _TECHMAP_REPLACE_ (.CLK(C), .CE(E), .LSR(!R), .DI(D), .Q(Q)); endmodule
|
||||||
module \$__DFFSE_PN1 (input D, C, E, R, output Q); TRELLIS_FF #(.GSR("AUTO"), .CEMUX("CE"), .CLKMUX("CLK"), .LSRMUX("LSR"), .REGSET("SET"), .SRMODE("LSR_OVER_CE")) _TECHMAP_REPLACE_ (.CLK(C), .CE(E), .LSR(!R), .DI(D), .Q(Q)); endmodule
|
module \$_SDFFE_PN1P_ (input D, C, E, R, output Q); TRELLIS_FF #(.GSR("AUTO"), .CEMUX("CE"), .CLKMUX("CLK"), .LSRMUX("LSR"), .REGSET("SET"), .SRMODE("LSR_OVER_CE")) _TECHMAP_REPLACE_ (.CLK(C), .CE(E), .LSR(!R), .DI(D), .Q(Q)); endmodule
|
||||||
|
|
||||||
module \$__DFFSE_NP0 (input D, C, E, R, output Q); TRELLIS_FF #(.GSR("AUTO"), .CEMUX("CE"), .CLKMUX("INV"), .LSRMUX("LSR"), .REGSET("RESET"), .SRMODE("LSR_OVER_CE")) _TECHMAP_REPLACE_ (.CLK(C), .CE(E), .LSR(R), .DI(D), .Q(Q)); endmodule
|
module \$_SDFFE_NP0P_ (input D, C, E, R, output Q); TRELLIS_FF #(.GSR("AUTO"), .CEMUX("CE"), .CLKMUX("INV"), .LSRMUX("LSR"), .REGSET("RESET"), .SRMODE("LSR_OVER_CE")) _TECHMAP_REPLACE_ (.CLK(C), .CE(E), .LSR(R), .DI(D), .Q(Q)); endmodule
|
||||||
module \$__DFFSE_NP1 (input D, C, E, R, output Q); TRELLIS_FF #(.GSR("AUTO"), .CEMUX("CE"), .CLKMUX("INV"), .LSRMUX("LSR"), .REGSET("SET"), .SRMODE("LSR_OVER_CE")) _TECHMAP_REPLACE_ (.CLK(C), .CE(E), .LSR(R), .DI(D), .Q(Q)); endmodule
|
module \$_SDFFE_NP1P_ (input D, C, E, R, output Q); TRELLIS_FF #(.GSR("AUTO"), .CEMUX("CE"), .CLKMUX("INV"), .LSRMUX("LSR"), .REGSET("SET"), .SRMODE("LSR_OVER_CE")) _TECHMAP_REPLACE_ (.CLK(C), .CE(E), .LSR(R), .DI(D), .Q(Q)); endmodule
|
||||||
module \$__DFFSE_PP0 (input D, C, E, R, output Q); TRELLIS_FF #(.GSR("AUTO"), .CEMUX("CE"), .CLKMUX("CLK"), .LSRMUX("LSR"), .REGSET("RESET"), .SRMODE("LSR_OVER_CE")) _TECHMAP_REPLACE_ (.CLK(C), .CE(E), .LSR(R), .DI(D), .Q(Q)); endmodule
|
module \$_SDFFE_PP0P_ (input D, C, E, R, output Q); TRELLIS_FF #(.GSR("AUTO"), .CEMUX("CE"), .CLKMUX("CLK"), .LSRMUX("LSR"), .REGSET("RESET"), .SRMODE("LSR_OVER_CE")) _TECHMAP_REPLACE_ (.CLK(C), .CE(E), .LSR(R), .DI(D), .Q(Q)); endmodule
|
||||||
module \$__DFFSE_PP1 (input D, C, E, R, output Q); TRELLIS_FF #(.GSR("AUTO"), .CEMUX("CE"), .CLKMUX("CLK"), .LSRMUX("LSR"), .REGSET("SET"), .SRMODE("LSR_OVER_CE")) _TECHMAP_REPLACE_ (.CLK(C), .CE(E), .LSR(R), .DI(D), .Q(Q)); endmodule
|
module \$_SDFFE_PP1P_ (input D, C, E, R, output Q); TRELLIS_FF #(.GSR("AUTO"), .CEMUX("CE"), .CLKMUX("CLK"), .LSRMUX("LSR"), .REGSET("SET"), .SRMODE("LSR_OVER_CE")) _TECHMAP_REPLACE_ (.CLK(C), .CE(E), .LSR(R), .DI(D), .Q(Q)); endmodule
|
||||||
|
|
||||||
`ifdef ASYNC_PRLD
|
`ifdef ASYNC_PRLD
|
||||||
module \$_DLATCH_N_ (input E, input D, output Q); TRELLIS_FF #(.GSR("DISABLED"), .CEMUX("1"), .LSRMODE("PRLD"), .LSRMUX("LSR"), .REGSET("RESET"), .SRMODE("ASYNC")) _TECHMAP_REPLACE_ (.LSR(!E), .DI(1'b0), .M(D), .Q(Q)); endmodule
|
module \$_DLATCH_N_ (input E, input D, output Q); TRELLIS_FF #(.GSR("DISABLED"), .CEMUX("1"), .LSRMODE("PRLD"), .LSRMUX("LSR"), .REGSET("RESET"), .SRMODE("ASYNC")) _TECHMAP_REPLACE_ (.LSR(!E), .DI(1'b0), .M(D), .Q(Q)); endmodule
|
||||||
|
|
|
@ -314,9 +314,9 @@ struct SynthEcp5Pass : public ScriptPass
|
||||||
run("dff2dffs");
|
run("dff2dffs");
|
||||||
run("opt_clean");
|
run("opt_clean");
|
||||||
if (!nodffe)
|
if (!nodffe)
|
||||||
run("dff2dffe -direct-match $_DFF_* -direct-match $__DFFS_*");
|
run("dff2dffe -direct-match $_DFF_* -direct-match $_SDFF_*");
|
||||||
if ((abc9 && dff) || help_mode)
|
if ((abc9 && dff) || help_mode)
|
||||||
run("zinit -all w:* t:$_DFF_?_ t:$_DFFE_??_ t:$__DFFS*", "(only if -abc9 and -dff");
|
run("zinit -all w:* t:$_DFF_?_ t:$_DFFE_??_ t:$_SDFF*", "(only if -abc9 and -dff");
|
||||||
run(stringf("techmap -D NO_LUT %s -map +/ecp5/cells_map.v", help_mode ? "[-D ASYNC_PRLD]" : (asyncprld ? "-D ASYNC_PRLD" : "")));
|
run(stringf("techmap -D NO_LUT %s -map +/ecp5/cells_map.v", help_mode ? "[-D ASYNC_PRLD]" : (asyncprld ? "-D ASYNC_PRLD" : "")));
|
||||||
run("opt_expr -undriven -mux_undef");
|
run("opt_expr -undriven -mux_undef");
|
||||||
run("simplemap");
|
run("simplemap");
|
||||||
|
|
|
@ -67,82 +67,82 @@ module \$_DFFE_NN_ #(parameter _TECHMAP_WIREINIT_Q_ = 1'bx) (input D, C, E, outp
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
// DFFR D Flip-Flop with Synchronous Reset
|
// DFFR D Flip-Flop with Synchronous Reset
|
||||||
module \$__DFFS_PN0_ #(parameter _TECHMAP_WIREINIT_Q_ = 1'bx) (input D, C, R, output Q);
|
module \$_SDFF_PN0_ #(parameter _TECHMAP_WIREINIT_Q_ = 1'bx) (input D, C, R, output Q);
|
||||||
DFFR _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C), .RESET(!R));
|
DFFR _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C), .RESET(!R));
|
||||||
wire _TECHMAP_REMOVEINIT_Q_ = _TECHMAP_WIREINIT_Q_ !== 1'b1;
|
wire _TECHMAP_REMOVEINIT_Q_ = _TECHMAP_WIREINIT_Q_ !== 1'b1;
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
module \$__DFFS_PP0_ #(parameter _TECHMAP_WIREINIT_Q_ = 1'bx) (input D, C, R, output Q);
|
module \$_SDFF_PP0_ #(parameter _TECHMAP_WIREINIT_Q_ = 1'bx) (input D, C, R, output Q);
|
||||||
DFFR _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C), .RESET(R));
|
DFFR _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C), .RESET(R));
|
||||||
wire _TECHMAP_REMOVEINIT_Q_ = _TECHMAP_WIREINIT_Q_ !== 1'b1;
|
wire _TECHMAP_REMOVEINIT_Q_ = _TECHMAP_WIREINIT_Q_ !== 1'b1;
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
// DFFNR D Flip-Flop with Negative-Edge Clock and Synchronous Reset
|
// DFFNR D Flip-Flop with Negative-Edge Clock and Synchronous Reset
|
||||||
module \$__DFFS_NN0_ #(parameter _TECHMAP_WIREINIT_Q_ = 1'bx) (input D, C, R, output Q);
|
module \$_SDFF_NN0_ #(parameter _TECHMAP_WIREINIT_Q_ = 1'bx) (input D, C, R, output Q);
|
||||||
DFFNR _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C), .RESET(!R));
|
DFFNR _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C), .RESET(!R));
|
||||||
wire _TECHMAP_REMOVEINIT_Q_ = _TECHMAP_WIREINIT_Q_ !== 1'b1;
|
wire _TECHMAP_REMOVEINIT_Q_ = _TECHMAP_WIREINIT_Q_ !== 1'b1;
|
||||||
endmodule
|
endmodule
|
||||||
module \$__DFFS_NP0_ #(parameter _TECHMAP_WIREINIT_Q_ = 1'bx) (input D, C, R, output Q);
|
module \$_SDFF_NP0_ #(parameter _TECHMAP_WIREINIT_Q_ = 1'bx) (input D, C, R, output Q);
|
||||||
DFFNR _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C), .RESET(R));
|
DFFNR _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C), .RESET(R));
|
||||||
wire _TECHMAP_REMOVEINIT_Q_ = _TECHMAP_WIREINIT_Q_ !== 1'b1;
|
wire _TECHMAP_REMOVEINIT_Q_ = _TECHMAP_WIREINIT_Q_ !== 1'b1;
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
// DFFRE D Flip-Flop with Clock Enable and Synchronous Reset
|
// DFFRE D Flip-Flop with Clock Enable and Synchronous Reset
|
||||||
module \$__DFFSE_PN0 #(parameter _TECHMAP_WIREINIT_Q_ = 1'bx) (input D, C, R, E, output Q);
|
module \$_SDFFE_PN0P_ #(parameter _TECHMAP_WIREINIT_Q_ = 1'bx) (input D, C, R, E, output Q);
|
||||||
DFFRE _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C), .RESET(!R), .CE(E));
|
DFFRE _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C), .RESET(!R), .CE(E));
|
||||||
wire _TECHMAP_REMOVEINIT_Q_ = _TECHMAP_WIREINIT_Q_ !== 1'b1;
|
wire _TECHMAP_REMOVEINIT_Q_ = _TECHMAP_WIREINIT_Q_ !== 1'b1;
|
||||||
endmodule
|
endmodule
|
||||||
module \$__DFFSE_PP0 #(parameter _TECHMAP_WIREINIT_Q_ = 1'bx) (input D, C, R, E, output Q);
|
module \$_SDFFE_PP0P_ #(parameter _TECHMAP_WIREINIT_Q_ = 1'bx) (input D, C, R, E, output Q);
|
||||||
DFFRE _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C), .RESET(R), .CE(E));
|
DFFRE _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C), .RESET(R), .CE(E));
|
||||||
wire _TECHMAP_REMOVEINIT_Q_ = _TECHMAP_WIREINIT_Q_ !== 1'b1;
|
wire _TECHMAP_REMOVEINIT_Q_ = _TECHMAP_WIREINIT_Q_ !== 1'b1;
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
// DFFNRE D Flip-Flop with Negative-Edge Clock,Clock Enable, and Synchronous Reset
|
// DFFNRE D Flip-Flop with Negative-Edge Clock,Clock Enable, and Synchronous Reset
|
||||||
module \$__DFFSE_NN0 #(parameter _TECHMAP_WIREINIT_Q_ = 1'bx) (input D, C, R, E, output Q);
|
module \$_SDFFE_NN0P_ #(parameter _TECHMAP_WIREINIT_Q_ = 1'bx) (input D, C, R, E, output Q);
|
||||||
DFFNRE _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C), .RESET(!R), .CE(E));
|
DFFNRE _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C), .RESET(!R), .CE(E));
|
||||||
wire _TECHMAP_REMOVEINIT_Q_ = _TECHMAP_WIREINIT_Q_ !== 1'b1;
|
wire _TECHMAP_REMOVEINIT_Q_ = _TECHMAP_WIREINIT_Q_ !== 1'b1;
|
||||||
endmodule
|
endmodule
|
||||||
module \$__DFFSE_NP0 #(parameter _TECHMAP_WIREINIT_Q_ = 1'bx) (input D, C, R, E, output Q);
|
module \$_SDFFE_NP0P_ #(parameter _TECHMAP_WIREINIT_Q_ = 1'bx) (input D, C, R, E, output Q);
|
||||||
DFFNRE _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C), .RESET(R), .CE(E));
|
DFFNRE _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C), .RESET(R), .CE(E));
|
||||||
wire _TECHMAP_REMOVEINIT_Q_ = _TECHMAP_WIREINIT_Q_ !== 1'b1;
|
wire _TECHMAP_REMOVEINIT_Q_ = _TECHMAP_WIREINIT_Q_ !== 1'b1;
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
// DFFS D Flip-Flop with Synchronous Set
|
// DFFS D Flip-Flop with Synchronous Set
|
||||||
module \$__DFFS_PN1_ #(parameter _TECHMAP_WIREINIT_Q_ = 1'bx) (input D, C, R, output Q);
|
module \$_SDFF_PN1_ #(parameter _TECHMAP_WIREINIT_Q_ = 1'bx) (input D, C, R, output Q);
|
||||||
DFFS _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C), .SET(!R));
|
DFFS _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C), .SET(!R));
|
||||||
wire _TECHMAP_REMOVEINIT_Q_ = _TECHMAP_WIREINIT_Q_ !== 1'b0;
|
wire _TECHMAP_REMOVEINIT_Q_ = _TECHMAP_WIREINIT_Q_ !== 1'b0;
|
||||||
endmodule
|
endmodule
|
||||||
module \$__DFFS_PP1_ #(parameter _TECHMAP_WIREINIT_Q_ = 1'bx) (input D, C, R, output Q);
|
module \$_SDFF_PP1_ #(parameter _TECHMAP_WIREINIT_Q_ = 1'bx) (input D, C, R, output Q);
|
||||||
DFFS _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C), .SET(R));
|
DFFS _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C), .SET(R));
|
||||||
wire _TECHMAP_REMOVEINIT_Q_ = _TECHMAP_WIREINIT_Q_ !== 1'b0;
|
wire _TECHMAP_REMOVEINIT_Q_ = _TECHMAP_WIREINIT_Q_ !== 1'b0;
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
// DFFNS D Flip-Flop with Negative-Edge Clock and Synchronous Set
|
// DFFNS D Flip-Flop with Negative-Edge Clock and Synchronous Set
|
||||||
module \$__DFFS_NN1_ #(parameter _TECHMAP_WIREINIT_Q_ = 1'bx) (input D, C, R, output Q);
|
module \$_SDFF_NN1_ #(parameter _TECHMAP_WIREINIT_Q_ = 1'bx) (input D, C, R, output Q);
|
||||||
DFFNS _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C), .SET(!R));
|
DFFNS _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C), .SET(!R));
|
||||||
wire _TECHMAP_REMOVEINIT_Q_ = _TECHMAP_WIREINIT_Q_ !== 1'b0;
|
wire _TECHMAP_REMOVEINIT_Q_ = _TECHMAP_WIREINIT_Q_ !== 1'b0;
|
||||||
endmodule
|
endmodule
|
||||||
module \$__DFFS_NP1_ #(parameter _TECHMAP_WIREINIT_Q_ = 1'bx) (input D, C, R, output Q);
|
module \$_SDFF_NP1_ #(parameter _TECHMAP_WIREINIT_Q_ = 1'bx) (input D, C, R, output Q);
|
||||||
DFFNS _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C), .SET(R));
|
DFFNS _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C), .SET(R));
|
||||||
wire _TECHMAP_REMOVEINIT_Q_ = _TECHMAP_WIREINIT_Q_ !== 1'b0;
|
wire _TECHMAP_REMOVEINIT_Q_ = _TECHMAP_WIREINIT_Q_ !== 1'b0;
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
// DFFSE D Flip-Flop with Clock Enable and Synchronous Set
|
// DFFSE D Flip-Flop with Clock Enable and Synchronous Set
|
||||||
module \$__DFFSE_PN1 #(parameter _TECHMAP_WIREINIT_Q_ = 1'bx) (input D, C, R, E, output Q);
|
module \$_SDFFE_PN1P_ #(parameter _TECHMAP_WIREINIT_Q_ = 1'bx) (input D, C, R, E, output Q);
|
||||||
DFFSE _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C), .SET(!R), .CE(E));
|
DFFSE _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C), .SET(!R), .CE(E));
|
||||||
wire _TECHMAP_REMOVEINIT_Q_ = _TECHMAP_WIREINIT_Q_ !== 1'b0;
|
wire _TECHMAP_REMOVEINIT_Q_ = _TECHMAP_WIREINIT_Q_ !== 1'b0;
|
||||||
endmodule
|
endmodule
|
||||||
module \$__DFFSE_PP1 #(parameter _TECHMAP_WIREINIT_Q_ = 1'bx) (input D, C, R, E, output Q);
|
module \$_SDFFE_PP1P_ #(parameter _TECHMAP_WIREINIT_Q_ = 1'bx) (input D, C, R, E, output Q);
|
||||||
DFFSE _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C), .SET(R), .CE(E));
|
DFFSE _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C), .SET(R), .CE(E));
|
||||||
wire _TECHMAP_REMOVEINIT_Q_ = _TECHMAP_WIREINIT_Q_ !== 1'b0;
|
wire _TECHMAP_REMOVEINIT_Q_ = _TECHMAP_WIREINIT_Q_ !== 1'b0;
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
// DFFNSE D Flip-Flop with Negative-Edge Clock,Clock Enable,and Synchronous Set
|
// DFFNSE D Flip-Flop with Negative-Edge Clock,Clock Enable,and Synchronous Set
|
||||||
module \$__DFFSE_NN1 #(parameter _TECHMAP_WIREINIT_Q_ = 1'bx) (input D, C, R, E, output Q);
|
module \$_SDFFE_NN1P_ #(parameter _TECHMAP_WIREINIT_Q_ = 1'bx) (input D, C, R, E, output Q);
|
||||||
DFFNSE _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C), .SET(!R), .CE(E));
|
DFFNSE _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C), .SET(!R), .CE(E));
|
||||||
wire _TECHMAP_REMOVEINIT_Q_ = _TECHMAP_WIREINIT_Q_ !== 1'b0;
|
wire _TECHMAP_REMOVEINIT_Q_ = _TECHMAP_WIREINIT_Q_ !== 1'b0;
|
||||||
endmodule
|
endmodule
|
||||||
module \$__DFFSE_NP1 #(parameter _TECHMAP_WIREINIT_Q_ = 1'bx) (input D, C, R, E, output Q);
|
module \$_SDFFE_NP1P_ #(parameter _TECHMAP_WIREINIT_Q_ = 1'bx) (input D, C, R, E, output Q);
|
||||||
DFFNSE _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C), .SET(R), .CE(E));
|
DFFNSE _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C), .SET(R), .CE(E));
|
||||||
wire _TECHMAP_REMOVEINIT_Q_ = _TECHMAP_WIREINIT_Q_ !== 1'b0;
|
wire _TECHMAP_REMOVEINIT_Q_ = _TECHMAP_WIREINIT_Q_ !== 1'b0;
|
||||||
endmodule
|
endmodule
|
||||||
|
@ -188,41 +188,41 @@ module \$_DFF_NN0_ #(parameter _TECHMAP_WIREINIT_Q_ = 1'bx) (input D, C, R, outp
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
// DFFPE D Flip-Flop with Clock Enable and Asynchronous Preset
|
// DFFPE D Flip-Flop with Clock Enable and Asynchronous Preset
|
||||||
module \$__DFFE_PP1 #(parameter _TECHMAP_WIREINIT_Q_ = 1'bx) (input D, C, R, E, output Q);
|
module \$_DFFE_PP1P_ #(parameter _TECHMAP_WIREINIT_Q_ = 1'bx) (input D, C, R, E, output Q);
|
||||||
DFFPE _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C), .PRESET(R), .CE(E));
|
DFFPE _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C), .PRESET(R), .CE(E));
|
||||||
wire _TECHMAP_REMOVEINIT_Q_ = _TECHMAP_WIREINIT_Q_ !== 1'b0;
|
wire _TECHMAP_REMOVEINIT_Q_ = _TECHMAP_WIREINIT_Q_ !== 1'b0;
|
||||||
endmodule
|
endmodule
|
||||||
module \$__DFFE_PN1 #(parameter _TECHMAP_WIREINIT_Q_ = 1'bx) (input D, C, R, E, output Q);
|
module \$_DFFE_PN1P_ #(parameter _TECHMAP_WIREINIT_Q_ = 1'bx) (input D, C, R, E, output Q);
|
||||||
DFFPE _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C), .PRESET(!R), .CE(E));
|
DFFPE _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C), .PRESET(!R), .CE(E));
|
||||||
wire _TECHMAP_REMOVEINIT_Q_ = _TECHMAP_WIREINIT_Q_ !== 1'b0;
|
wire _TECHMAP_REMOVEINIT_Q_ = _TECHMAP_WIREINIT_Q_ !== 1'b0;
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
// DFFNPE D Flip-Flop with Negative-Edge Clock,Clock Enable, and Asynchronous Preset
|
// DFFNPE D Flip-Flop with Negative-Edge Clock,Clock Enable, and Asynchronous Preset
|
||||||
module \$__DFFE_NP1 #(parameter _TECHMAP_WIREINIT_Q_ = 1'bx) (input D, C, R, E, output Q);
|
module \$_DFFE_NP1P_ #(parameter _TECHMAP_WIREINIT_Q_ = 1'bx) (input D, C, R, E, output Q);
|
||||||
DFFNPE _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C), .PRESET(R), .CE(E));
|
DFFNPE _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C), .PRESET(R), .CE(E));
|
||||||
wire _TECHMAP_REMOVEINIT_Q_ = _TECHMAP_WIREINIT_Q_ !== 1'b0;
|
wire _TECHMAP_REMOVEINIT_Q_ = _TECHMAP_WIREINIT_Q_ !== 1'b0;
|
||||||
endmodule
|
endmodule
|
||||||
module \$__DFFE_NN1 #(parameter _TECHMAP_WIREINIT_Q_ = 1'bx) (input D, C, R, E, output Q);
|
module \$_DFFE_NN1P_ #(parameter _TECHMAP_WIREINIT_Q_ = 1'bx) (input D, C, R, E, output Q);
|
||||||
DFFNPE _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C), .PRESET(!R), .CE(E));
|
DFFNPE _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C), .PRESET(!R), .CE(E));
|
||||||
wire _TECHMAP_REMOVEINIT_Q_ = _TECHMAP_WIREINIT_Q_ !== 1'b0;
|
wire _TECHMAP_REMOVEINIT_Q_ = _TECHMAP_WIREINIT_Q_ !== 1'b0;
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
// DFFCE D Flip-Flop with Clock Enable and Asynchronous Clear
|
// DFFCE D Flip-Flop with Clock Enable and Asynchronous Clear
|
||||||
module \$__DFFE_PP0 #(parameter _TECHMAP_WIREINIT_Q_ = 1'bx) (input D, C, R, E, output Q);
|
module \$_DFFE_PP0P_ #(parameter _TECHMAP_WIREINIT_Q_ = 1'bx) (input D, C, R, E, output Q);
|
||||||
DFFCE _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C), .CLEAR(R), .CE(E));
|
DFFCE _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C), .CLEAR(R), .CE(E));
|
||||||
wire _TECHMAP_REMOVEINIT_Q_ = _TECHMAP_WIREINIT_Q_ !== 1'b1;
|
wire _TECHMAP_REMOVEINIT_Q_ = _TECHMAP_WIREINIT_Q_ !== 1'b1;
|
||||||
endmodule
|
endmodule
|
||||||
module \$__DFFE_PN0 #(parameter _TECHMAP_WIREINIT_Q_ = 1'bx) (input D, C, R, E, output Q);
|
module \$_DFFE_PN0P_ #(parameter _TECHMAP_WIREINIT_Q_ = 1'bx) (input D, C, R, E, output Q);
|
||||||
DFFCE _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C), .CLEAR(!R), .CE(E));
|
DFFCE _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C), .CLEAR(!R), .CE(E));
|
||||||
wire _TECHMAP_REMOVEINIT_Q_ = _TECHMAP_WIREINIT_Q_ !== 1'b1;
|
wire _TECHMAP_REMOVEINIT_Q_ = _TECHMAP_WIREINIT_Q_ !== 1'b1;
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
// DFFNCE D Flip-Flop with Negative-Edge Clock,Clock Enable and Asynchronous Clear
|
// DFFNCE D Flip-Flop with Negative-Edge Clock,Clock Enable and Asynchronous Clear
|
||||||
module \$__DFFE_NP0 #(parameter _TECHMAP_WIREINIT_Q_ = 1'bx) (input D, C, R, E, output Q);
|
module \$_DFFE_NP0P_ #(parameter _TECHMAP_WIREINIT_Q_ = 1'bx) (input D, C, R, E, output Q);
|
||||||
DFFNCE _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C), .CLEAR(R), .CE(E));
|
DFFNCE _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C), .CLEAR(R), .CE(E));
|
||||||
wire _TECHMAP_REMOVEINIT_Q_ = _TECHMAP_WIREINIT_Q_ !== 1'b1;
|
wire _TECHMAP_REMOVEINIT_Q_ = _TECHMAP_WIREINIT_Q_ !== 1'b1;
|
||||||
endmodule
|
endmodule
|
||||||
module \$__DFFE_NN0 #(parameter _TECHMAP_WIREINIT_Q_ = 1'bx) (input D, C, R, E, output Q);
|
module \$_DFFE_NN0P_ #(parameter _TECHMAP_WIREINIT_Q_ = 1'bx) (input D, C, R, E, output Q);
|
||||||
DFFNCE _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C), .CLEAR(!R), .CE(E));
|
DFFNCE _TECHMAP_REPLACE_ (.D(D), .Q(Q), .CLK(C), .CLEAR(!R), .CE(E));
|
||||||
wire _TECHMAP_REMOVEINIT_Q_ = _TECHMAP_WIREINIT_Q_ !== 1'b1;
|
wire _TECHMAP_REMOVEINIT_Q_ = _TECHMAP_WIREINIT_Q_ !== 1'b1;
|
||||||
endmodule
|
endmodule
|
||||||
|
|
|
@ -222,7 +222,7 @@ struct SynthGowinPass : public ScriptPass
|
||||||
run("dff2dffs -match-init");
|
run("dff2dffs -match-init");
|
||||||
run("opt_clean");
|
run("opt_clean");
|
||||||
if (!nodffe)
|
if (!nodffe)
|
||||||
run("dff2dffe -direct-match $_DFF_* -direct-match $__DFFS_*");
|
run("dff2dffe -direct-match $_DFF_* -direct-match $_SDFF_*");
|
||||||
run("techmap -map +/gowin/cells_map.v");
|
run("techmap -map +/gowin/cells_map.v");
|
||||||
run("opt_expr -mux_undef");
|
run("opt_expr -mux_undef");
|
||||||
run("simplemap");
|
run("simplemap");
|
||||||
|
|
|
@ -17,12 +17,12 @@ module \$_DFF_NP1_ (input D, C, R, output Q); SB_DFFNS _TECHMAP_REPLACE_ (.D(D)
|
||||||
module \$_DFF_PP0_ (input D, C, R, output Q); SB_DFFR _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .R(R)); endmodule
|
module \$_DFF_PP0_ (input D, C, R, output Q); SB_DFFR _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .R(R)); endmodule
|
||||||
module \$_DFF_PP1_ (input D, C, R, output Q); SB_DFFS _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .S(R)); endmodule
|
module \$_DFF_PP1_ (input D, C, R, output Q); SB_DFFS _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .S(R)); endmodule
|
||||||
|
|
||||||
module \$__DFFE_NN0 (input D, C, E, R, output Q); SB_DFFNER _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .E(E), .R(!R)); endmodule
|
module \$_DFFE_NN0P_ (input D, C, E, R, output Q); SB_DFFNER _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .E(E), .R(!R)); endmodule
|
||||||
module \$__DFFE_NN1 (input D, C, E, R, output Q); SB_DFFNES _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .E(E), .S(!R)); endmodule
|
module \$_DFFE_NN1P_ (input D, C, E, R, output Q); SB_DFFNES _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .E(E), .S(!R)); endmodule
|
||||||
module \$__DFFE_PN0 (input D, C, E, R, output Q); SB_DFFER _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .E(E), .R(!R)); endmodule
|
module \$_DFFE_PN0P_ (input D, C, E, R, output Q); SB_DFFER _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .E(E), .R(!R)); endmodule
|
||||||
module \$__DFFE_PN1 (input D, C, E, R, output Q); SB_DFFES _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .E(E), .S(!R)); endmodule
|
module \$_DFFE_PN1P_ (input D, C, E, R, output Q); SB_DFFES _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .E(E), .S(!R)); endmodule
|
||||||
|
|
||||||
module \$__DFFE_NP0 (input D, C, E, R, output Q); SB_DFFNER _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .E(E), .R(R)); endmodule
|
module \$_DFFE_NP0P_ (input D, C, E, R, output Q); SB_DFFNER _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .E(E), .R(R)); endmodule
|
||||||
module \$__DFFE_NP1 (input D, C, E, R, output Q); SB_DFFNES _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .E(E), .S(R)); endmodule
|
module \$_DFFE_NP1P_ (input D, C, E, R, output Q); SB_DFFNES _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .E(E), .S(R)); endmodule
|
||||||
module \$__DFFE_PP0 (input D, C, E, R, output Q); SB_DFFER _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .E(E), .R(R)); endmodule
|
module \$_DFFE_PP0P_ (input D, C, E, R, output Q); SB_DFFER _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .E(E), .R(R)); endmodule
|
||||||
module \$__DFFE_PP1 (input D, C, E, R, output Q); SB_DFFES _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .E(E), .S(R)); endmodule
|
module \$_DFFE_PP1P_ (input D, C, E, R, output Q); SB_DFFES _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .E(E), .S(R)); endmodule
|
||||||
|
|
|
@ -362,7 +362,7 @@ struct SynthIce40Pass : public ScriptPass
|
||||||
run("simplemap t:$dff");
|
run("simplemap t:$dff");
|
||||||
}
|
}
|
||||||
if ((abc9 && dff) || help_mode)
|
if ((abc9 && dff) || help_mode)
|
||||||
run("zinit -all w:* t:$_DFF_?_ t:$_DFFE_??_ t:$__DFFS*", "(only if -abc9 and -dff");
|
run("zinit -all w:* t:$_DFF_?_ t:$_DFFE_??_ t:$_SDFF*", "(only if -abc9 and -dff");
|
||||||
run("techmap -map +/ice40/ff_map.v");
|
run("techmap -map +/ice40/ff_map.v");
|
||||||
run("opt_expr -mux_undef");
|
run("opt_expr -mux_undef");
|
||||||
run("simplemap");
|
run("simplemap");
|
||||||
|
|
|
@ -48,7 +48,7 @@ module \$_DFF_PP0_ (input D, C, R, output Q);
|
||||||
dffeas #(.is_wysiwyg(WYSIWYG), .power_up(power_up)) _TECHMAP_REPLACE_ (.d(D), .q(Q), .clk(C), .clrn(R_i), .prn(1'b1), .ena(1'b1), .asdata(1'b0), .aload(1'b0), .sclr(1'b0), .sload(1'b0));
|
dffeas #(.is_wysiwyg(WYSIWYG), .power_up(power_up)) _TECHMAP_REPLACE_ (.d(D), .q(Q), .clk(C), .clrn(R_i), .prn(1'b1), .ena(1'b1), .asdata(1'b0), .aload(1'b0), .sclr(1'b0), .sload(1'b0));
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
module \$__DFFE_PP0 (input D, C, E, R, output Q);
|
module \$_DFFE_PP0P_ (input D, C, E, R, output Q);
|
||||||
parameter WYSIWYG="TRUE";
|
parameter WYSIWYG="TRUE";
|
||||||
parameter power_up=1'bx;
|
parameter power_up=1'bx;
|
||||||
wire E_i = ~ E;
|
wire E_i = ~ E;
|
||||||
|
|
|
@ -48,7 +48,7 @@ module \$_DFF_PP0_ (input D, C, R, output Q);
|
||||||
dffeas #(.is_wysiwyg(WYSIWYG), .power_up(power_up)) _TECHMAP_REPLACE_ (.d(D), .q(Q), .clk(C), .clrn(R_i), .prn(1'b1), .ena(1'b1), .asdata(1'b0), .aload(1'b0), .sclr(1'b0), .sload(1'b0));
|
dffeas #(.is_wysiwyg(WYSIWYG), .power_up(power_up)) _TECHMAP_REPLACE_ (.d(D), .q(Q), .clk(C), .clrn(R_i), .prn(1'b1), .ena(1'b1), .asdata(1'b0), .aload(1'b0), .sclr(1'b0), .sload(1'b0));
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
module \$__DFFE_PP0 (input D, C, E, R, output Q);
|
module \$_DFFE_PP0P_ (input D, C, E, R, output Q);
|
||||||
parameter WYSIWYG="TRUE";
|
parameter WYSIWYG="TRUE";
|
||||||
parameter power_up=1'bx;
|
parameter power_up=1'bx;
|
||||||
wire E_i = ~ E;
|
wire E_i = ~ E;
|
||||||
|
|
|
@ -48,7 +48,7 @@ module \$_DFF_PP0_ (input D, C, R, output Q);
|
||||||
dffeas #(.is_wysiwyg(WYSIWYG), .power_up(power_up)) _TECHMAP_REPLACE_ (.d(D), .q(Q), .clk(C), .clrn(R_i), .prn(1'b1), .ena(1'b1), .asdata(1'b0), .aload(1'b0), .sclr(1'b0), .sload(1'b0));
|
dffeas #(.is_wysiwyg(WYSIWYG), .power_up(power_up)) _TECHMAP_REPLACE_ (.d(D), .q(Q), .clk(C), .clrn(R_i), .prn(1'b1), .ena(1'b1), .asdata(1'b0), .aload(1'b0), .sclr(1'b0), .sload(1'b0));
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
module \$__DFFE_PP0 (input D, C, E, R, output Q);
|
module \$_DFFE_PP0P_ (input D, C, E, R, output Q);
|
||||||
parameter WYSIWYG="TRUE";
|
parameter WYSIWYG="TRUE";
|
||||||
parameter power_up=1'bx;
|
parameter power_up=1'bx;
|
||||||
wire E_i = ~ E;
|
wire E_i = ~ E;
|
||||||
|
|
|
@ -50,7 +50,7 @@ module \$_DFF_PP0_ (input D, C, R, output Q);
|
||||||
dffeas #(.is_wysiwyg(WYSIWYG), .power_up(power_up)) _TECHMAP_REPLACE_ (.d(D), .q(Q), .clk(C), .clrn(R_i), .prn(1'b1), .ena(1'b1), .asdata(1'b0), .aload(1'b0), .sclr(1'b0), .sload(1'b0));
|
dffeas #(.is_wysiwyg(WYSIWYG), .power_up(power_up)) _TECHMAP_REPLACE_ (.d(D), .q(Q), .clk(C), .clrn(R_i), .prn(1'b1), .ena(1'b1), .asdata(1'b0), .aload(1'b0), .sclr(1'b0), .sload(1'b0));
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
module \$__DFFE_PP0 (input D, C, E, R, output Q);
|
module \$_DFFE_PP0P_ (input D, C, E, R, output Q);
|
||||||
parameter WYSIWYG="TRUE";
|
parameter WYSIWYG="TRUE";
|
||||||
parameter power_up=1'bx;
|
parameter power_up=1'bx;
|
||||||
wire E_i = ~ E;
|
wire E_i = ~ E;
|
||||||
|
|
|
@ -48,7 +48,7 @@ module \$_DFF_PP0_ (input D, C, R, output Q);
|
||||||
dffeas #(.is_wysiwyg(WYSIWYG), .power_up(power_up)) _TECHMAP_REPLACE_ (.d(D), .q(Q), .clk(C), .clrn(R_i), .prn(1'b1), .ena(1'b1), .asdata(1'b0), .aload(1'b0), .sclr(1'b0), .sload(1'b0));
|
dffeas #(.is_wysiwyg(WYSIWYG), .power_up(power_up)) _TECHMAP_REPLACE_ (.d(D), .q(Q), .clk(C), .clrn(R_i), .prn(1'b1), .ena(1'b1), .asdata(1'b0), .aload(1'b0), .sclr(1'b0), .sload(1'b0));
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
module \$__DFFE_PP0 (input D, C, E, R, output Q);
|
module \$_DFFE_PP0P_ (input D, C, E, R, output Q);
|
||||||
parameter WYSIWYG="TRUE";
|
parameter WYSIWYG="TRUE";
|
||||||
parameter power_up=1'bx;
|
parameter power_up=1'bx;
|
||||||
wire E_i = ~ E;
|
wire E_i = ~ E;
|
||||||
|
|
|
@ -44,15 +44,15 @@ endmodule
|
||||||
// module \$_DFFE_NP_ (input D, C, E, output Q); SB_DFFNE _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .E(E)); endmodule
|
// module \$_DFFE_NP_ (input D, C, E, output Q); SB_DFFNE _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .E(E)); endmodule
|
||||||
// module \$_DFFE_PP_ (input D, C, E, output Q); SB_DFFE _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .E(E)); endmodule
|
// module \$_DFFE_PP_ (input D, C, E, output Q); SB_DFFE _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .E(E)); endmodule
|
||||||
//
|
//
|
||||||
// module \$__DFFE_NN0 (input D, C, E, R, output Q); SB_DFFNER _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .E(E), .R(!R)); endmodule
|
// module \$_DFFE_NN0P_ (input D, C, E, R, output Q); SB_DFFNER _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .E(E), .R(!R)); endmodule
|
||||||
// module \$__DFFE_NN1 (input D, C, E, R, output Q); SB_DFFNES _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .E(E), .S(!R)); endmodule
|
// module \$_DFFE_NN1P_ (input D, C, E, R, output Q); SB_DFFNES _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .E(E), .S(!R)); endmodule
|
||||||
// module \$__DFFE_PN0 (input D, C, E, R, output Q); SB_DFFER _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .E(E), .R(!R)); endmodule
|
// module \$_DFFE_PN0P_ (input D, C, E, R, output Q); SB_DFFER _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .E(E), .R(!R)); endmodule
|
||||||
// module \$__DFFE_PN1 (input D, C, E, R, output Q); SB_DFFES _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .E(E), .S(!R)); endmodule
|
// module \$_DFFE_PN1P_ (input D, C, E, R, output Q); SB_DFFES _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .E(E), .S(!R)); endmodule
|
||||||
//
|
//
|
||||||
// module \$__DFFE_NP0 (input D, C, E, R, output Q); SB_DFFNER _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .E(E), .R(R)); endmodule
|
// module \$_DFFE_NP0P_ (input D, C, E, R, output Q); SB_DFFNER _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .E(E), .R(R)); endmodule
|
||||||
// module \$__DFFE_NP1 (input D, C, E, R, output Q); SB_DFFNES _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .E(E), .S(R)); endmodule
|
// module \$_DFFE_NP1P_ (input D, C, E, R, output Q); SB_DFFNES _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .E(E), .S(R)); endmodule
|
||||||
// module \$__DFFE_PP0 (input D, C, E, R, output Q); SB_DFFER _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .E(E), .R(R)); endmodule
|
// module \$_DFFE_PP0P_ (input D, C, E, R, output Q); SB_DFFER _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .E(E), .R(R)); endmodule
|
||||||
// module \$__DFFE_PP1 (input D, C, E, R, output Q); SB_DFFES _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .E(E), .S(R)); endmodule
|
// module \$_DFFE_PP1P_ (input D, C, E, R, output Q); SB_DFFES _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .E(E), .S(R)); endmodule
|
||||||
|
|
||||||
`ifndef NO_LUT
|
`ifndef NO_LUT
|
||||||
module \$lut (A, Y);
|
module \$lut (A, Y);
|
||||||
|
|
|
@ -28,32 +28,32 @@ module _90_dff_nn1_to_np1 (input D, C, R, output Q); \$_DFF_NP1_ _TECHMAP_REPL
|
||||||
(* techmap_celltype = "$_DFF_PN1_" *)
|
(* techmap_celltype = "$_DFF_PN1_" *)
|
||||||
module _90_dff_pn1_to_pp1 (input D, C, R, output Q); \$_DFF_PP1_ _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .R(~R)); endmodule
|
module _90_dff_pn1_to_pp1 (input D, C, R, output Q); \$_DFF_PP1_ _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .R(~R)); endmodule
|
||||||
|
|
||||||
(* techmap_celltype = "$__DFFE_NN0" *)
|
(* techmap_celltype = "$_DFFE_NN0P_" *)
|
||||||
module _90_dffe_nn0_to_np0 (input D, C, R, E, output Q); \$__DFFE_NP0 _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .R(~R), .E(E)); endmodule
|
module _90_dffe_nn0_to_np0 (input D, C, R, E, output Q); \$_DFFE_NP0P_ _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .R(~R), .E(E)); endmodule
|
||||||
(* techmap_celltype = "$__DFFE_PN0" *)
|
(* techmap_celltype = "$_DFFE_PN0P_" *)
|
||||||
module _90_dffe_pn0_to_pp0 (input D, C, R, E, output Q); \$__DFFE_PP0 _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .R(~R), .E(E)); endmodule
|
module _90_dffe_pn0_to_pp0 (input D, C, R, E, output Q); \$_DFFE_PP0P_ _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .R(~R), .E(E)); endmodule
|
||||||
(* techmap_celltype = "$__DFFE_NN1" *)
|
(* techmap_celltype = "$_DFFE_NN1P_" *)
|
||||||
module _90_dffe_nn1_to_np1 (input D, C, R, E, output Q); \$__DFFE_NP1 _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .R(~R), .E(E)); endmodule
|
module _90_dffe_nn1_to_np1 (input D, C, R, E, output Q); \$_DFFE_NP1P_ _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .R(~R), .E(E)); endmodule
|
||||||
(* techmap_celltype = "$__DFFE_PN1" *)
|
(* techmap_celltype = "$_DFFE_PN1P_" *)
|
||||||
module _90_dffe_pn1_to_pp1 (input D, C, R, E, output Q); \$__DFFE_PP1 _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .R(~R), .E(E)); endmodule
|
module _90_dffe_pn1_to_pp1 (input D, C, R, E, output Q); \$_DFFE_PP1P_ _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .R(~R), .E(E)); endmodule
|
||||||
|
|
||||||
(* techmap_celltype = "$__DFFS_NN0_" *)
|
(* techmap_celltype = "$_SDFF_NN0_" *)
|
||||||
module _90_dffs_nn0_to_np0 (input D, C, R, output Q); \$__DFFS_NP0_ _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .R(~R)); endmodule
|
module _90_dffs_nn0_to_np0 (input D, C, R, output Q); \$_SDFF_NP0_ _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .R(~R)); endmodule
|
||||||
(* techmap_celltype = "$__DFFS_PN0_" *)
|
(* techmap_celltype = "$_SDFF_PN0_" *)
|
||||||
module _90_dffs_pn0_to_pp0 (input D, C, R, output Q); \$__DFFS_PP0_ _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .R(~R)); endmodule
|
module _90_dffs_pn0_to_pp0 (input D, C, R, output Q); \$_SDFF_PP0_ _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .R(~R)); endmodule
|
||||||
(* techmap_celltype = "$__DFFS_NN1_" *)
|
(* techmap_celltype = "$_SDFF_NN1_" *)
|
||||||
module _90_dffs_nn1_to_np1 (input D, C, R, output Q); \$__DFFS_NP1_ _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .R(~R)); endmodule
|
module _90_dffs_nn1_to_np1 (input D, C, R, output Q); \$_SDFF_NP1_ _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .R(~R)); endmodule
|
||||||
(* techmap_celltype = "$__DFFS_PN1_" *)
|
(* techmap_celltype = "$_SDFF_PN1_" *)
|
||||||
module _90_dffs_pn1_to_pp1 (input D, C, R, output Q); \$__DFFS_PP1_ _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .R(~R)); endmodule
|
module _90_dffs_pn1_to_pp1 (input D, C, R, output Q); \$_SDFF_PP1_ _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .R(~R)); endmodule
|
||||||
|
|
||||||
(* techmap_celltype = "$__DFFSE_NN0" *)
|
(* techmap_celltype = "$_SDFFE_NN0P_" *)
|
||||||
module _90_dffse_nn0_to_np0 (input D, C, R, E, output Q); \$__DFFSE_NP0 _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .R(~R), .E(E)); endmodule
|
module _90_dffse_nn0_to_np0 (input D, C, R, E, output Q); \$_SDFFE_NP0P_ _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .R(~R), .E(E)); endmodule
|
||||||
(* techmap_celltype = "$__DFFSE_PN0" *)
|
(* techmap_celltype = "$_SDFFE_PN0P_" *)
|
||||||
module _90_dffse_pn0_to_pp0 (input D, C, R, E, output Q); \$__DFFSE_PP0 _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .R(~R), .E(E)); endmodule
|
module _90_dffse_pn0_to_pp0 (input D, C, R, E, output Q); \$_SDFFE_PP0P_ _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .R(~R), .E(E)); endmodule
|
||||||
(* techmap_celltype = "$__DFFSE_NN1" *)
|
(* techmap_celltype = "$_SDFFE_NN1P_" *)
|
||||||
module _90_dffse_nn1_to_np1 (input D, C, R, E, output Q); \$__DFFSE_NP1 _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .R(~R), .E(E)); endmodule
|
module _90_dffse_nn1_to_np1 (input D, C, R, E, output Q); \$_SDFFE_NP1P_ _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .R(~R), .E(E)); endmodule
|
||||||
(* techmap_celltype = "$__DFFSE_PN1" *)
|
(* techmap_celltype = "$_SDFFE_PN1P_" *)
|
||||||
module _90_dffse_pn1_to_pp1 (input D, C, R, E, output Q); \$__DFFSE_PP1 _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .R(~R), .E(E)); endmodule
|
module _90_dffse_pn1_to_pp1 (input D, C, R, E, output Q); \$_SDFFE_PP1P_ _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .R(~R), .E(E)); 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;
|
||||||
|
|
|
@ -540,7 +540,7 @@ struct SynthXilinxPass : public ScriptPass
|
||||||
}
|
}
|
||||||
|
|
||||||
if (check_label("fine")) {
|
if (check_label("fine")) {
|
||||||
run("dff2dffe -direct-match $_DFF_* -direct-match $__DFFS_*");
|
run("dff2dffe -direct-match $_DFF_* -direct-match $_SDFF_*");
|
||||||
if (help_mode)
|
if (help_mode)
|
||||||
run("muxcover <internal options> ('-widemux' only)");
|
run("muxcover <internal options> ('-widemux' only)");
|
||||||
else if (widemux > 0) {
|
else if (widemux > 0) {
|
||||||
|
@ -598,7 +598,7 @@ struct SynthXilinxPass : public ScriptPass
|
||||||
if (check_label("map_ffs", "('-abc9' only)")) {
|
if (check_label("map_ffs", "('-abc9' only)")) {
|
||||||
if (abc9 || help_mode) {
|
if (abc9 || help_mode) {
|
||||||
if (dff || help_mode)
|
if (dff || help_mode)
|
||||||
run("zinit -all w:* t:$_DFF_?_ t:$_DFFE_??_ t:$__DFFS*", "('-dff' only)");
|
run("zinit -all w:* t:$_DFF_?_ t:$_DFFE_??_ t:$_SDFF*", "('-dff' only)");
|
||||||
run("techmap -map " + ff_map_file);
|
run("techmap -map " + ff_map_file);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -111,7 +111,7 @@ endmodule
|
||||||
|
|
||||||
// Async reset, enable.
|
// Async reset, enable.
|
||||||
|
|
||||||
module \$__DFFE_NP0 (input D, C, E, R, output Q);
|
module \$_DFFE_NP0P_ (input D, C, E, R, output Q);
|
||||||
parameter [0:0] _TECHMAP_WIREINIT_Q_ = 1'bx;
|
parameter [0:0] _TECHMAP_WIREINIT_Q_ = 1'bx;
|
||||||
generate if (_TECHMAP_WIREINIT_Q_ === 1'b1)
|
generate if (_TECHMAP_WIREINIT_Q_ === 1'b1)
|
||||||
$error("Spartan 6 doesn't support FFs with asynchronous reset initialized to 1");
|
$error("Spartan 6 doesn't support FFs with asynchronous reset initialized to 1");
|
||||||
|
@ -120,7 +120,7 @@ module \$__DFFE_NP0 (input D, C, E, R, output Q);
|
||||||
endgenerate
|
endgenerate
|
||||||
wire _TECHMAP_REMOVEINIT_Q_ = 1;
|
wire _TECHMAP_REMOVEINIT_Q_ = 1;
|
||||||
endmodule
|
endmodule
|
||||||
module \$__DFFE_PP0 (input D, C, E, R, output Q);
|
module \$_DFFE_PP0P_ (input D, C, E, R, output Q);
|
||||||
parameter [0:0] _TECHMAP_WIREINIT_Q_ = 1'bx;
|
parameter [0:0] _TECHMAP_WIREINIT_Q_ = 1'bx;
|
||||||
generate if (_TECHMAP_WIREINIT_Q_ === 1'b1)
|
generate if (_TECHMAP_WIREINIT_Q_ === 1'b1)
|
||||||
$error("Spartan 6 doesn't support FFs with asynchronous reset initialized to 1");
|
$error("Spartan 6 doesn't support FFs with asynchronous reset initialized to 1");
|
||||||
|
@ -130,7 +130,7 @@ module \$__DFFE_PP0 (input D, C, E, R, output Q);
|
||||||
wire _TECHMAP_REMOVEINIT_Q_ = 1;
|
wire _TECHMAP_REMOVEINIT_Q_ = 1;
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
module \$__DFFE_NP1 (input D, C, E, R, output Q);
|
module \$_DFFE_NP1P_ (input D, C, E, R, output Q);
|
||||||
parameter [0:0] _TECHMAP_WIREINIT_Q_ = 1'bx;
|
parameter [0:0] _TECHMAP_WIREINIT_Q_ = 1'bx;
|
||||||
generate if (_TECHMAP_WIREINIT_Q_ === 1'b0)
|
generate if (_TECHMAP_WIREINIT_Q_ === 1'b0)
|
||||||
$error("Spartan 6 doesn't support FFs with asynchronous set initialized to 0");
|
$error("Spartan 6 doesn't support FFs with asynchronous set initialized to 0");
|
||||||
|
@ -139,7 +139,7 @@ module \$__DFFE_NP1 (input D, C, E, R, output Q);
|
||||||
endgenerate
|
endgenerate
|
||||||
wire _TECHMAP_REMOVEINIT_Q_ = 1;
|
wire _TECHMAP_REMOVEINIT_Q_ = 1;
|
||||||
endmodule
|
endmodule
|
||||||
module \$__DFFE_PP1 (input D, C, E, R, output Q);
|
module \$_DFFE_PP1P_ (input D, C, E, R, output Q);
|
||||||
parameter [0:0] _TECHMAP_WIREINIT_Q_ = 1'bx;
|
parameter [0:0] _TECHMAP_WIREINIT_Q_ = 1'bx;
|
||||||
generate if (_TECHMAP_WIREINIT_Q_ === 1'b0)
|
generate if (_TECHMAP_WIREINIT_Q_ === 1'b0)
|
||||||
$error("Spartan 6 doesn't support FFs with asynchronous set initialized to 0");
|
$error("Spartan 6 doesn't support FFs with asynchronous set initialized to 0");
|
||||||
|
@ -151,7 +151,7 @@ endmodule
|
||||||
|
|
||||||
// Sync reset.
|
// Sync reset.
|
||||||
|
|
||||||
module \$__DFFS_NP0_ (input D, C, R, output Q);
|
module \$_SDFF_NP0_ (input D, C, R, output Q);
|
||||||
parameter [0:0] _TECHMAP_WIREINIT_Q_ = 1'bx;
|
parameter [0:0] _TECHMAP_WIREINIT_Q_ = 1'bx;
|
||||||
generate if (_TECHMAP_WIREINIT_Q_ === 1'b1)
|
generate if (_TECHMAP_WIREINIT_Q_ === 1'b1)
|
||||||
$error("Spartan 6 doesn't support FFs with reset initialized to 1");
|
$error("Spartan 6 doesn't support FFs with reset initialized to 1");
|
||||||
|
@ -160,7 +160,7 @@ module \$__DFFS_NP0_ (input D, C, R, output Q);
|
||||||
endgenerate
|
endgenerate
|
||||||
wire _TECHMAP_REMOVEINIT_Q_ = 1;
|
wire _TECHMAP_REMOVEINIT_Q_ = 1;
|
||||||
endmodule
|
endmodule
|
||||||
module \$__DFFS_PP0_ (input D, C, R, output Q);
|
module \$_SDFF_PP0_ (input D, C, R, output Q);
|
||||||
parameter [0:0] _TECHMAP_WIREINIT_Q_ = 1'bx;
|
parameter [0:0] _TECHMAP_WIREINIT_Q_ = 1'bx;
|
||||||
generate if (_TECHMAP_WIREINIT_Q_ === 1'b1)
|
generate if (_TECHMAP_WIREINIT_Q_ === 1'b1)
|
||||||
$error("Spartan 6 doesn't support FFs with reset initialized to 1");
|
$error("Spartan 6 doesn't support FFs with reset initialized to 1");
|
||||||
|
@ -170,7 +170,7 @@ module \$__DFFS_PP0_ (input D, C, R, output Q);
|
||||||
wire _TECHMAP_REMOVEINIT_Q_ = 1;
|
wire _TECHMAP_REMOVEINIT_Q_ = 1;
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
module \$__DFFS_NP1_ (input D, C, R, output Q);
|
module \$_SDFF_NP1_ (input D, C, R, output Q);
|
||||||
parameter [0:0] _TECHMAP_WIREINIT_Q_ = 1'bx;
|
parameter [0:0] _TECHMAP_WIREINIT_Q_ = 1'bx;
|
||||||
generate if (_TECHMAP_WIREINIT_Q_ === 1'b0)
|
generate if (_TECHMAP_WIREINIT_Q_ === 1'b0)
|
||||||
$error("Spartan 6 doesn't support FFs with set initialized to 0");
|
$error("Spartan 6 doesn't support FFs with set initialized to 0");
|
||||||
|
@ -179,7 +179,7 @@ module \$__DFFS_NP1_ (input D, C, R, output Q);
|
||||||
endgenerate
|
endgenerate
|
||||||
wire _TECHMAP_REMOVEINIT_Q_ = 1;
|
wire _TECHMAP_REMOVEINIT_Q_ = 1;
|
||||||
endmodule
|
endmodule
|
||||||
module \$__DFFS_PP1_ (input D, C, R, output Q);
|
module \$_SDFF_PP1_ (input D, C, R, output Q);
|
||||||
parameter [0:0] _TECHMAP_WIREINIT_Q_ = 1'bx;
|
parameter [0:0] _TECHMAP_WIREINIT_Q_ = 1'bx;
|
||||||
generate if (_TECHMAP_WIREINIT_Q_ === 1'b0)
|
generate if (_TECHMAP_WIREINIT_Q_ === 1'b0)
|
||||||
$error("Spartan 6 doesn't support FFs with set initialized to 0");
|
$error("Spartan 6 doesn't support FFs with set initialized to 0");
|
||||||
|
@ -191,7 +191,7 @@ endmodule
|
||||||
|
|
||||||
// Sync reset, enable.
|
// Sync reset, enable.
|
||||||
|
|
||||||
module \$__DFFSE_NP0 (input D, C, E, R, output Q);
|
module \$_SDFFE_NP0P_ (input D, C, E, R, output Q);
|
||||||
parameter [0:0] _TECHMAP_WIREINIT_Q_ = 1'bx;
|
parameter [0:0] _TECHMAP_WIREINIT_Q_ = 1'bx;
|
||||||
generate if (_TECHMAP_WIREINIT_Q_ === 1'b1)
|
generate if (_TECHMAP_WIREINIT_Q_ === 1'b1)
|
||||||
$error("Spartan 6 doesn't support FFs with reset initialized to 1");
|
$error("Spartan 6 doesn't support FFs with reset initialized to 1");
|
||||||
|
@ -200,7 +200,7 @@ module \$__DFFSE_NP0 (input D, C, E, R, output Q);
|
||||||
endgenerate
|
endgenerate
|
||||||
wire _TECHMAP_REMOVEINIT_Q_ = 1;
|
wire _TECHMAP_REMOVEINIT_Q_ = 1;
|
||||||
endmodule
|
endmodule
|
||||||
module \$__DFFSE_PP0 (input D, C, E, R, output Q);
|
module \$_SDFFE_PP0P_ (input D, C, E, R, output Q);
|
||||||
parameter [0:0] _TECHMAP_WIREINIT_Q_ = 1'bx;
|
parameter [0:0] _TECHMAP_WIREINIT_Q_ = 1'bx;
|
||||||
generate if (_TECHMAP_WIREINIT_Q_ === 1'b1)
|
generate if (_TECHMAP_WIREINIT_Q_ === 1'b1)
|
||||||
$error("Spartan 6 doesn't support FFs with reset initialized to 1");
|
$error("Spartan 6 doesn't support FFs with reset initialized to 1");
|
||||||
|
@ -210,7 +210,7 @@ module \$__DFFSE_PP0 (input D, C, E, R, output Q);
|
||||||
wire _TECHMAP_REMOVEINIT_Q_ = 1;
|
wire _TECHMAP_REMOVEINIT_Q_ = 1;
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
module \$__DFFSE_NP1 (input D, C, E, R, output Q);
|
module \$_SDFFE_NP1P_ (input D, C, E, R, output Q);
|
||||||
parameter [0:0] _TECHMAP_WIREINIT_Q_ = 1'bx;
|
parameter [0:0] _TECHMAP_WIREINIT_Q_ = 1'bx;
|
||||||
generate if (_TECHMAP_WIREINIT_Q_ === 1'b0)
|
generate if (_TECHMAP_WIREINIT_Q_ === 1'b0)
|
||||||
$error("Spartan 6 doesn't support FFs with set initialized to 0");
|
$error("Spartan 6 doesn't support FFs with set initialized to 0");
|
||||||
|
@ -219,7 +219,7 @@ module \$__DFFSE_NP1 (input D, C, E, R, output Q);
|
||||||
endgenerate
|
endgenerate
|
||||||
wire _TECHMAP_REMOVEINIT_Q_ = 1;
|
wire _TECHMAP_REMOVEINIT_Q_ = 1;
|
||||||
endmodule
|
endmodule
|
||||||
module \$__DFFSE_PP1 (input D, C, E, R, output Q);
|
module \$_SDFFE_PP1P_ (input D, C, E, R, output Q);
|
||||||
parameter [0:0] _TECHMAP_WIREINIT_Q_ = 1'bx;
|
parameter [0:0] _TECHMAP_WIREINIT_Q_ = 1'bx;
|
||||||
generate if (_TECHMAP_WIREINIT_Q_ === 1'b0)
|
generate if (_TECHMAP_WIREINIT_Q_ === 1'b0)
|
||||||
$error("Spartan 6 doesn't support FFs with set initialized to 0");
|
$error("Spartan 6 doesn't support FFs with set initialized to 0");
|
||||||
|
|
|
@ -89,23 +89,23 @@ endmodule
|
||||||
|
|
||||||
// Async reset, enable.
|
// Async reset, enable.
|
||||||
|
|
||||||
module \$__DFFE_NP0 (input D, C, E, R, output Q);
|
module \$_DFFE_NP0P_ (input D, C, E, R, output Q);
|
||||||
parameter _TECHMAP_WIREINIT_Q_ = 1'bx;
|
parameter _TECHMAP_WIREINIT_Q_ = 1'bx;
|
||||||
FDCE_1 #(.INIT(_TECHMAP_WIREINIT_Q_)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(E), .CLR( R));
|
FDCE_1 #(.INIT(_TECHMAP_WIREINIT_Q_)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(E), .CLR( R));
|
||||||
wire _TECHMAP_REMOVEINIT_Q_ = 1;
|
wire _TECHMAP_REMOVEINIT_Q_ = 1;
|
||||||
endmodule
|
endmodule
|
||||||
module \$__DFFE_PP0 (input D, C, E, R, output Q);
|
module \$_DFFE_PP0P_ (input D, C, E, R, output Q);
|
||||||
parameter _TECHMAP_WIREINIT_Q_ = 1'bx;
|
parameter _TECHMAP_WIREINIT_Q_ = 1'bx;
|
||||||
FDCE #(.INIT(_TECHMAP_WIREINIT_Q_)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(E), .CLR( R));
|
FDCE #(.INIT(_TECHMAP_WIREINIT_Q_)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(E), .CLR( R));
|
||||||
wire _TECHMAP_REMOVEINIT_Q_ = 1;
|
wire _TECHMAP_REMOVEINIT_Q_ = 1;
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
module \$__DFFE_NP1 (input D, C, E, R, output Q);
|
module \$_DFFE_NP1P_ (input D, C, E, R, output Q);
|
||||||
parameter _TECHMAP_WIREINIT_Q_ = 1'bx;
|
parameter _TECHMAP_WIREINIT_Q_ = 1'bx;
|
||||||
FDPE_1 #(.INIT(_TECHMAP_WIREINIT_Q_)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(E), .PRE( R));
|
FDPE_1 #(.INIT(_TECHMAP_WIREINIT_Q_)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(E), .PRE( R));
|
||||||
wire _TECHMAP_REMOVEINIT_Q_ = 1;
|
wire _TECHMAP_REMOVEINIT_Q_ = 1;
|
||||||
endmodule
|
endmodule
|
||||||
module \$__DFFE_PP1 (input D, C, E, R, output Q);
|
module \$_DFFE_PP1P_ (input D, C, E, R, output Q);
|
||||||
parameter _TECHMAP_WIREINIT_Q_ = 1'bx;
|
parameter _TECHMAP_WIREINIT_Q_ = 1'bx;
|
||||||
FDPE #(.INIT(_TECHMAP_WIREINIT_Q_)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(E), .PRE( R));
|
FDPE #(.INIT(_TECHMAP_WIREINIT_Q_)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(E), .PRE( R));
|
||||||
wire _TECHMAP_REMOVEINIT_Q_ = 1;
|
wire _TECHMAP_REMOVEINIT_Q_ = 1;
|
||||||
|
@ -113,23 +113,23 @@ endmodule
|
||||||
|
|
||||||
// Sync reset.
|
// Sync reset.
|
||||||
|
|
||||||
module \$__DFFS_NP0_ (input D, C, R, output Q);
|
module \$_SDFF_NP0_ (input D, C, R, output Q);
|
||||||
parameter _TECHMAP_WIREINIT_Q_ = 1'bx;
|
parameter _TECHMAP_WIREINIT_Q_ = 1'bx;
|
||||||
FDRE_1 #(.INIT(_TECHMAP_WIREINIT_Q_)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(1'b1), .R( R));
|
FDRE_1 #(.INIT(_TECHMAP_WIREINIT_Q_)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(1'b1), .R( R));
|
||||||
wire _TECHMAP_REMOVEINIT_Q_ = 1;
|
wire _TECHMAP_REMOVEINIT_Q_ = 1;
|
||||||
endmodule
|
endmodule
|
||||||
module \$__DFFS_PP0_ (input D, C, R, output Q);
|
module \$_SDFF_PP0_ (input D, C, R, output Q);
|
||||||
parameter _TECHMAP_WIREINIT_Q_ = 1'bx;
|
parameter _TECHMAP_WIREINIT_Q_ = 1'bx;
|
||||||
FDRE #(.INIT(_TECHMAP_WIREINIT_Q_)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(1'b1), .R( R));
|
FDRE #(.INIT(_TECHMAP_WIREINIT_Q_)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(1'b1), .R( R));
|
||||||
wire _TECHMAP_REMOVEINIT_Q_ = 1;
|
wire _TECHMAP_REMOVEINIT_Q_ = 1;
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
module \$__DFFS_NP1_ (input D, C, R, output Q);
|
module \$_SDFF_NP1_ (input D, C, R, output Q);
|
||||||
parameter _TECHMAP_WIREINIT_Q_ = 1'bx;
|
parameter _TECHMAP_WIREINIT_Q_ = 1'bx;
|
||||||
FDSE_1 #(.INIT(_TECHMAP_WIREINIT_Q_)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(1'b1), .S( R));
|
FDSE_1 #(.INIT(_TECHMAP_WIREINIT_Q_)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(1'b1), .S( R));
|
||||||
wire _TECHMAP_REMOVEINIT_Q_ = 1;
|
wire _TECHMAP_REMOVEINIT_Q_ = 1;
|
||||||
endmodule
|
endmodule
|
||||||
module \$__DFFS_PP1_ (input D, C, R, output Q);
|
module \$_SDFF_PP1_ (input D, C, R, output Q);
|
||||||
parameter _TECHMAP_WIREINIT_Q_ = 1'bx;
|
parameter _TECHMAP_WIREINIT_Q_ = 1'bx;
|
||||||
FDSE #(.INIT(_TECHMAP_WIREINIT_Q_)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(1'b1), .S( R));
|
FDSE #(.INIT(_TECHMAP_WIREINIT_Q_)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(1'b1), .S( R));
|
||||||
wire _TECHMAP_REMOVEINIT_Q_ = 1;
|
wire _TECHMAP_REMOVEINIT_Q_ = 1;
|
||||||
|
@ -137,23 +137,23 @@ endmodule
|
||||||
|
|
||||||
// Sync reset, enable.
|
// Sync reset, enable.
|
||||||
|
|
||||||
module \$__DFFSE_NP0 (input D, C, E, R, output Q);
|
module \$_SDFFE_NP0P_ (input D, C, E, R, output Q);
|
||||||
parameter _TECHMAP_WIREINIT_Q_ = 1'bx;
|
parameter _TECHMAP_WIREINIT_Q_ = 1'bx;
|
||||||
FDRE_1 #(.INIT(_TECHMAP_WIREINIT_Q_)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(E), .R( R));
|
FDRE_1 #(.INIT(_TECHMAP_WIREINIT_Q_)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(E), .R( R));
|
||||||
wire _TECHMAP_REMOVEINIT_Q_ = 1;
|
wire _TECHMAP_REMOVEINIT_Q_ = 1;
|
||||||
endmodule
|
endmodule
|
||||||
module \$__DFFSE_PP0 (input D, C, E, R, output Q);
|
module \$_SDFFE_PP0P_ (input D, C, E, R, output Q);
|
||||||
parameter _TECHMAP_WIREINIT_Q_ = 1'bx;
|
parameter _TECHMAP_WIREINIT_Q_ = 1'bx;
|
||||||
FDRE #(.INIT(_TECHMAP_WIREINIT_Q_)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(E), .R( R));
|
FDRE #(.INIT(_TECHMAP_WIREINIT_Q_)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(E), .R( R));
|
||||||
wire _TECHMAP_REMOVEINIT_Q_ = 1;
|
wire _TECHMAP_REMOVEINIT_Q_ = 1;
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
module \$__DFFSE_NP1 (input D, C, E, R, output Q);
|
module \$_SDFFE_NP1P_ (input D, C, E, R, output Q);
|
||||||
parameter _TECHMAP_WIREINIT_Q_ = 1'bx;
|
parameter _TECHMAP_WIREINIT_Q_ = 1'bx;
|
||||||
FDSE_1 #(.INIT(_TECHMAP_WIREINIT_Q_)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(E), .S( R));
|
FDSE_1 #(.INIT(_TECHMAP_WIREINIT_Q_)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(E), .S( R));
|
||||||
wire _TECHMAP_REMOVEINIT_Q_ = 1;
|
wire _TECHMAP_REMOVEINIT_Q_ = 1;
|
||||||
endmodule
|
endmodule
|
||||||
module \$__DFFSE_PP1 (input D, C, E, R, output Q);
|
module \$_SDFFE_PP1P_ (input D, C, E, R, output Q);
|
||||||
parameter _TECHMAP_WIREINIT_Q_ = 1'bx;
|
parameter _TECHMAP_WIREINIT_Q_ = 1'bx;
|
||||||
FDSE #(.INIT(_TECHMAP_WIREINIT_Q_)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(E), .S( R));
|
FDSE #(.INIT(_TECHMAP_WIREINIT_Q_)) _TECHMAP_REPLACE_ (.D(D), .Q(Q), .C(C), .CE(E), .S( R));
|
||||||
wire _TECHMAP_REMOVEINIT_Q_ = 1;
|
wire _TECHMAP_REMOVEINIT_Q_ = 1;
|
||||||
|
|
|
@ -31,20 +31,20 @@ design -save ref
|
||||||
dff2dffs
|
dff2dffs
|
||||||
clean
|
clean
|
||||||
|
|
||||||
select -assert-count 1 w:q0 %x t:$__DFFS_PP0_ %i
|
select -assert-count 1 w:q0 %x t:$_SDFF_PP0_ %i
|
||||||
select -assert-count 1 w:q1 %x t:$__DFFS_PP1_ %i
|
select -assert-count 1 w:q1 %x t:$_SDFF_PP1_ %i
|
||||||
select -assert-count 1 w:q2 %x t:$__DFFS_PP0_ %i
|
select -assert-count 1 w:q2 %x t:$_SDFF_PP0_ %i
|
||||||
select -assert-count 1 w:q3 %x t:$__DFFS_PP1_ %i
|
select -assert-count 1 w:q3 %x t:$_SDFF_PP1_ %i
|
||||||
select -assert-count 1 w:q4 %x t:$__DFFS_PP0_ %i
|
select -assert-count 1 w:q4 %x t:$_SDFF_PP0_ %i
|
||||||
select -assert-count 1 w:q5 %x t:$__DFFS_PP1_ %i
|
select -assert-count 1 w:q5 %x t:$_SDFF_PP1_ %i
|
||||||
|
|
||||||
design -load ref
|
design -load ref
|
||||||
dff2dffs -match-init
|
dff2dffs -match-init
|
||||||
clean
|
clean
|
||||||
|
|
||||||
select -assert-count 1 w:q0 %x t:$__DFFS_PP0_ %i
|
select -assert-count 1 w:q0 %x t:$_SDFF_PP0_ %i
|
||||||
select -assert-count 0 w:q1 %x t:$__DFFS_PP1_ %i
|
select -assert-count 0 w:q1 %x t:$_SDFF_PP1_ %i
|
||||||
select -assert-count 0 w:q2 %x t:$__DFFS_PP0_ %i
|
select -assert-count 0 w:q2 %x t:$_SDFF_PP0_ %i
|
||||||
select -assert-count 1 w:q3 %x t:$__DFFS_PP1_ %i
|
select -assert-count 1 w:q3 %x t:$_SDFF_PP1_ %i
|
||||||
select -assert-count 1 w:q4 %x t:$__DFFS_PP0_ %i
|
select -assert-count 1 w:q4 %x t:$_SDFF_PP0_ %i
|
||||||
select -assert-count 1 w:q5 %x t:$__DFFS_PP1_ %i
|
select -assert-count 1 w:q5 %x t:$_SDFF_PP1_ %i
|
||||||
|
|
|
@ -61,32 +61,32 @@ design -reset
|
||||||
read_verilog -icells <<EOT
|
read_verilog -icells <<EOT
|
||||||
module top(input C, R, D, E, (* init = {24{1'b1}} *) output [23:0] Q);
|
module top(input C, R, D, E, (* init = {24{1'b1}} *) output [23:0] Q);
|
||||||
|
|
||||||
$__DFFE_NN0 dff0 (.C(C), .D(D), .E(E), .R(R), .Q(Q[0]));
|
$_DFFE_NN0P_ dff0 (.C(C), .D(D), .E(E), .R(R), .Q(Q[0]));
|
||||||
$__DFFE_NN1 dff1 (.C(C), .D(D), .E(E), .R(R), .Q(Q[1]));
|
$_DFFE_NN1P_ dff1 (.C(C), .D(D), .E(E), .R(R), .Q(Q[1]));
|
||||||
$__DFFE_NP0 dff2 (.C(C), .D(D), .E(E), .R(R), .Q(Q[2]));
|
$_DFFE_NP0P_ dff2 (.C(C), .D(D), .E(E), .R(R), .Q(Q[2]));
|
||||||
$__DFFE_NP1 dff3 (.C(C), .D(D), .E(E), .R(R), .Q(Q[3]));
|
$_DFFE_NP1P_ dff3 (.C(C), .D(D), .E(E), .R(R), .Q(Q[3]));
|
||||||
$__DFFE_PN0 dff4 (.C(C), .D(D), .E(E), .R(R), .Q(Q[4]));
|
$_DFFE_PN0P_ dff4 (.C(C), .D(D), .E(E), .R(R), .Q(Q[4]));
|
||||||
$__DFFE_PN1 dff5 (.C(C), .D(D), .E(E), .R(R), .Q(Q[5]));
|
$_DFFE_PN1P_ dff5 (.C(C), .D(D), .E(E), .R(R), .Q(Q[5]));
|
||||||
$__DFFE_PP0 dff6 (.C(C), .D(D), .E(E), .R(R), .Q(Q[6]));
|
$_DFFE_PP0P_ dff6 (.C(C), .D(D), .E(E), .R(R), .Q(Q[6]));
|
||||||
$__DFFE_PP1 dff7 (.C(C), .D(D), .E(E), .R(R), .Q(Q[7]));
|
$_DFFE_PP1P_ dff7 (.C(C), .D(D), .E(E), .R(R), .Q(Q[7]));
|
||||||
|
|
||||||
$__DFFS_NN0_ dff8 (.C(C), .D(D[0]), .R(R), .Q(Q[8]));
|
$_SDFF_NN0_ dff8 (.C(C), .D(D[0]), .R(R), .Q(Q[8]));
|
||||||
$__DFFS_NN1_ dff9 (.C(C), .D(D[0]), .R(R), .Q(Q[9]));
|
$_SDFF_NN1_ dff9 (.C(C), .D(D[0]), .R(R), .Q(Q[9]));
|
||||||
$__DFFS_NP0_ dff10(.C(C), .D(D[0]), .R(R), .Q(Q[10]));
|
$_SDFF_NP0_ dff10(.C(C), .D(D[0]), .R(R), .Q(Q[10]));
|
||||||
$__DFFS_NP1_ dff11(.C(C), .D(D[0]), .R(R), .Q(Q[11]));
|
$_SDFF_NP1_ dff11(.C(C), .D(D[0]), .R(R), .Q(Q[11]));
|
||||||
$__DFFS_PN0_ dff12(.C(C), .D(D[0]), .R(R), .Q(Q[12]));
|
$_SDFF_PN0_ dff12(.C(C), .D(D[0]), .R(R), .Q(Q[12]));
|
||||||
$__DFFS_PN1_ dff13(.C(C), .D(D[0]), .R(R), .Q(Q[13]));
|
$_SDFF_PN1_ dff13(.C(C), .D(D[0]), .R(R), .Q(Q[13]));
|
||||||
$__DFFS_PP0_ dff14(.C(C), .D(D[0]), .R(R), .Q(Q[14]));
|
$_SDFF_PP0_ dff14(.C(C), .D(D[0]), .R(R), .Q(Q[14]));
|
||||||
$__DFFS_PP1_ dff15(.C(C), .D(D[0]), .R(R), .Q(Q[15]));
|
$_SDFF_PP1_ dff15(.C(C), .D(D[0]), .R(R), .Q(Q[15]));
|
||||||
|
|
||||||
$__DFFSE_NN0 dff16(.C(C), .D(D[0]),.E(E), .R(R), .Q(Q[16]));
|
$_SDFFE_NN0P_ dff16(.C(C), .D(D[0]),.E(E), .R(R), .Q(Q[16]));
|
||||||
$__DFFSE_NN1 dff17(.C(C), .D(D[0]),.E(E), .R(R), .Q(Q[17]));
|
$_SDFFE_NN1P_ dff17(.C(C), .D(D[0]),.E(E), .R(R), .Q(Q[17]));
|
||||||
$__DFFSE_NP0 dff18(.C(C), .D(D[0]),.E(E), .R(R), .Q(Q[18]));
|
$_SDFFE_NP0P_ dff18(.C(C), .D(D[0]),.E(E), .R(R), .Q(Q[18]));
|
||||||
$__DFFSE_NP1 dff19(.C(C), .D(D[0]),.E(E), .R(R), .Q(Q[19]));
|
$_SDFFE_NP1P_ dff19(.C(C), .D(D[0]),.E(E), .R(R), .Q(Q[19]));
|
||||||
$__DFFSE_PN0 dff20(.C(C), .D(D[0]),.E(E), .R(R), .Q(Q[20]));
|
$_SDFFE_PN0P_ dff20(.C(C), .D(D[0]),.E(E), .R(R), .Q(Q[20]));
|
||||||
$__DFFSE_PN1 dff21(.C(C), .D(D[0]),.E(E), .R(R), .Q(Q[21]));
|
$_SDFFE_PN1P_ dff21(.C(C), .D(D[0]),.E(E), .R(R), .Q(Q[21]));
|
||||||
$__DFFSE_PP0 dff22(.C(C), .D(D[0]),.E(E), .R(R), .Q(Q[22]));
|
$_SDFFE_PP0P_ dff22(.C(C), .D(D[0]),.E(E), .R(R), .Q(Q[22]));
|
||||||
$__DFFSE_PP1 dff23(.C(C), .D(D[0]),.E(E), .R(R), .Q(Q[23]));
|
$_SDFFE_PP1P_ dff23(.C(C), .D(D[0]),.E(E), .R(R), .Q(Q[23]));
|
||||||
|
|
||||||
endmodule
|
endmodule
|
||||||
EOT
|
EOT
|
||||||
|
@ -96,44 +96,44 @@ zinit
|
||||||
|
|
||||||
select -assert-count 48 t:$_NOT_
|
select -assert-count 48 t:$_NOT_
|
||||||
select -assert-count 1 w:Q a:init=24'bx %i
|
select -assert-count 1 w:Q a:init=24'bx %i
|
||||||
select -assert-count 4 c:dff0 c:dff2 c:dff4 c:dff6 %% t:$__DFFE_??1 %i
|
select -assert-count 4 c:dff0 c:dff2 c:dff4 c:dff6 %% t:$_DFFE_??1P_ %i
|
||||||
select -assert-count 4 c:dff1 c:dff3 c:dff5 c:dff7 %% t:$__DFFE_??0 %i
|
select -assert-count 4 c:dff1 c:dff3 c:dff5 c:dff7 %% t:$_DFFE_??0P_ %i
|
||||||
select -assert-count 4 c:dff8 c:dff10 c:dff12 c:dff14 %% t:$__DFFS_??1_ %i
|
select -assert-count 4 c:dff8 c:dff10 c:dff12 c:dff14 %% t:$_SDFF_??1_ %i
|
||||||
select -assert-count 4 c:dff9 c:dff11 c:dff13 c:dff15 %% t:$__DFFS_??0_ %i
|
select -assert-count 4 c:dff9 c:dff11 c:dff13 c:dff15 %% t:$_SDFF_??0_ %i
|
||||||
select -assert-count 4 c:dff16 c:dff18 c:dff20 c:dff22 %% t:$__DFFSE_??1 %i
|
select -assert-count 4 c:dff16 c:dff18 c:dff20 c:dff22 %% t:$_SDFFE_??1P_ %i
|
||||||
select -assert-count 4 c:dff17 c:dff19 c:dff21 c:dff23 %% t:$__DFFSE_??0 %i
|
select -assert-count 4 c:dff17 c:dff19 c:dff21 c:dff23 %% t:$_SDFFE_??0P_ %i
|
||||||
|
|
||||||
|
|
||||||
design -reset
|
design -reset
|
||||||
read_verilog -icells <<EOT
|
read_verilog -icells <<EOT
|
||||||
module top(input C, R, D, E, (* init = {24{1'b0}} *) output [23:0] Q);
|
module top(input C, R, D, E, (* init = {24{1'b0}} *) output [23:0] Q);
|
||||||
|
|
||||||
$__DFFE_NN0 dff0 (.C(C), .D(D), .E(E), .R(R), .Q(Q[0]));
|
$_DFFE_NN0P_ dff0 (.C(C), .D(D), .E(E), .R(R), .Q(Q[0]));
|
||||||
$__DFFE_NN1 dff1 (.C(C), .D(D), .E(E), .R(R), .Q(Q[1]));
|
$_DFFE_NN1P_ dff1 (.C(C), .D(D), .E(E), .R(R), .Q(Q[1]));
|
||||||
$__DFFE_NP0 dff2 (.C(C), .D(D), .E(E), .R(R), .Q(Q[2]));
|
$_DFFE_NP0P_ dff2 (.C(C), .D(D), .E(E), .R(R), .Q(Q[2]));
|
||||||
$__DFFE_NP1 dff3 (.C(C), .D(D), .E(E), .R(R), .Q(Q[3]));
|
$_DFFE_NP1P_ dff3 (.C(C), .D(D), .E(E), .R(R), .Q(Q[3]));
|
||||||
$__DFFE_PN0 dff4 (.C(C), .D(D), .E(E), .R(R), .Q(Q[4]));
|
$_DFFE_PN0P_ dff4 (.C(C), .D(D), .E(E), .R(R), .Q(Q[4]));
|
||||||
$__DFFE_PN1 dff5 (.C(C), .D(D), .E(E), .R(R), .Q(Q[5]));
|
$_DFFE_PN1P_ dff5 (.C(C), .D(D), .E(E), .R(R), .Q(Q[5]));
|
||||||
$__DFFE_PP0 dff6 (.C(C), .D(D), .E(E), .R(R), .Q(Q[6]));
|
$_DFFE_PP0P_ dff6 (.C(C), .D(D), .E(E), .R(R), .Q(Q[6]));
|
||||||
$__DFFE_PP1 dff7 (.C(C), .D(D), .E(E), .R(R), .Q(Q[7]));
|
$_DFFE_PP1P_ dff7 (.C(C), .D(D), .E(E), .R(R), .Q(Q[7]));
|
||||||
|
|
||||||
$__DFFS_NN0_ dff8 (.C(C), .D(D[0]), .R(R), .Q(Q[8]));
|
$_SDFF_NN0_ dff8 (.C(C), .D(D[0]), .R(R), .Q(Q[8]));
|
||||||
$__DFFS_NN1_ dff9 (.C(C), .D(D[0]), .R(R), .Q(Q[9]));
|
$_SDFF_NN1_ dff9 (.C(C), .D(D[0]), .R(R), .Q(Q[9]));
|
||||||
$__DFFS_NP0_ dff10(.C(C), .D(D[0]), .R(R), .Q(Q[10]));
|
$_SDFF_NP0_ dff10(.C(C), .D(D[0]), .R(R), .Q(Q[10]));
|
||||||
$__DFFS_NP1_ dff11(.C(C), .D(D[0]), .R(R), .Q(Q[11]));
|
$_SDFF_NP1_ dff11(.C(C), .D(D[0]), .R(R), .Q(Q[11]));
|
||||||
$__DFFS_PN0_ dff12(.C(C), .D(D[0]), .R(R), .Q(Q[12]));
|
$_SDFF_PN0_ dff12(.C(C), .D(D[0]), .R(R), .Q(Q[12]));
|
||||||
$__DFFS_PN1_ dff13(.C(C), .D(D[0]), .R(R), .Q(Q[13]));
|
$_SDFF_PN1_ dff13(.C(C), .D(D[0]), .R(R), .Q(Q[13]));
|
||||||
$__DFFS_PP0_ dff14(.C(C), .D(D[0]), .R(R), .Q(Q[14]));
|
$_SDFF_PP0_ dff14(.C(C), .D(D[0]), .R(R), .Q(Q[14]));
|
||||||
$__DFFS_PP1_ dff15(.C(C), .D(D[0]), .R(R), .Q(Q[15]));
|
$_SDFF_PP1_ dff15(.C(C), .D(D[0]), .R(R), .Q(Q[15]));
|
||||||
|
|
||||||
$__DFFSE_NN0 dff16(.C(C), .D(D[0]),.E(E), .R(R), .Q(Q[16]));
|
$_SDFFE_NN0P_ dff16(.C(C), .D(D[0]),.E(E), .R(R), .Q(Q[16]));
|
||||||
$__DFFSE_NN1 dff17(.C(C), .D(D[0]),.E(E), .R(R), .Q(Q[17]));
|
$_SDFFE_NN1P_ dff17(.C(C), .D(D[0]),.E(E), .R(R), .Q(Q[17]));
|
||||||
$__DFFSE_NP0 dff18(.C(C), .D(D[0]),.E(E), .R(R), .Q(Q[18]));
|
$_SDFFE_NP0P_ dff18(.C(C), .D(D[0]),.E(E), .R(R), .Q(Q[18]));
|
||||||
$__DFFSE_NP1 dff19(.C(C), .D(D[0]),.E(E), .R(R), .Q(Q[19]));
|
$_SDFFE_NP1P_ dff19(.C(C), .D(D[0]),.E(E), .R(R), .Q(Q[19]));
|
||||||
$__DFFSE_PN0 dff20(.C(C), .D(D[0]),.E(E), .R(R), .Q(Q[20]));
|
$_SDFFE_PN0P_ dff20(.C(C), .D(D[0]),.E(E), .R(R), .Q(Q[20]));
|
||||||
$__DFFSE_PN1 dff21(.C(C), .D(D[0]),.E(E), .R(R), .Q(Q[21]));
|
$_SDFFE_PN1P_ dff21(.C(C), .D(D[0]),.E(E), .R(R), .Q(Q[21]));
|
||||||
$__DFFSE_PP0 dff22(.C(C), .D(D[0]),.E(E), .R(R), .Q(Q[22]));
|
$_SDFFE_PP0P_ dff22(.C(C), .D(D[0]),.E(E), .R(R), .Q(Q[22]));
|
||||||
$__DFFSE_PP1 dff23(.C(C), .D(D[0]),.E(E), .R(R), .Q(Q[23]));
|
$_SDFFE_PP1P_ dff23(.C(C), .D(D[0]),.E(E), .R(R), .Q(Q[23]));
|
||||||
|
|
||||||
endmodule
|
endmodule
|
||||||
EOT
|
EOT
|
||||||
|
@ -143,9 +143,9 @@ zinit
|
||||||
|
|
||||||
select -assert-count 0 t:$_NOT_
|
select -assert-count 0 t:$_NOT_
|
||||||
select -assert-count 1 w:Q a:init=24'bx %i
|
select -assert-count 1 w:Q a:init=24'bx %i
|
||||||
select -assert-count 4 c:dff0 c:dff2 c:dff4 c:dff6 %% t:$__DFFE_??0 %i
|
select -assert-count 4 c:dff0 c:dff2 c:dff4 c:dff6 %% t:$_DFFE_??0P_ %i
|
||||||
select -assert-count 4 c:dff1 c:dff3 c:dff5 c:dff7 %% t:$__DFFE_??1 %i
|
select -assert-count 4 c:dff1 c:dff3 c:dff5 c:dff7 %% t:$_DFFE_??1P_ %i
|
||||||
select -assert-count 4 c:dff8 c:dff10 c:dff12 c:dff14 %% t:$__DFFS_??0_ %i
|
select -assert-count 4 c:dff8 c:dff10 c:dff12 c:dff14 %% t:$_SDFF_??0_ %i
|
||||||
select -assert-count 4 c:dff9 c:dff11 c:dff13 c:dff15 %% t:$__DFFS_??1_ %i
|
select -assert-count 4 c:dff9 c:dff11 c:dff13 c:dff15 %% t:$_SDFF_??1_ %i
|
||||||
select -assert-count 4 c:dff16 c:dff18 c:dff20 c:dff22 %% t:$__DFFSE_??0 %i
|
select -assert-count 4 c:dff16 c:dff18 c:dff20 c:dff22 %% t:$_SDFFE_??0P_ %i
|
||||||
select -assert-count 4 c:dff17 c:dff19 c:dff21 c:dff23 %% t:$__DFFSE_??1 %i
|
select -assert-count 4 c:dff17 c:dff19 c:dff21 c:dff23 %% t:$_SDFFE_??1P_ %i
|
||||||
|
|
Loading…
Reference in New Issue