mirror of
https://github.com/YosysHQ/yosys
synced 2025-06-06 06:03:23 +00:00
Add $bmux and $demux cells.
This commit is contained in:
parent
db33b1e535
commit
93508d58da
25 changed files with 694 additions and 49 deletions
|
@ -1251,6 +1251,22 @@ namespace {
|
|||
return;
|
||||
}
|
||||
|
||||
if (cell->type == ID($bmux)) {
|
||||
port(ID::A, param(ID::WIDTH) << param(ID::S_WIDTH));
|
||||
port(ID::S, param(ID::S_WIDTH));
|
||||
port(ID::Y, param(ID::WIDTH));
|
||||
check_expected();
|
||||
return;
|
||||
}
|
||||
|
||||
if (cell->type == ID($demux)) {
|
||||
port(ID::A, param(ID::WIDTH));
|
||||
port(ID::S, param(ID::S_WIDTH));
|
||||
port(ID::Y, param(ID::WIDTH) << param(ID::S_WIDTH));
|
||||
check_expected();
|
||||
return;
|
||||
}
|
||||
|
||||
if (cell->type == ID($lut)) {
|
||||
param(ID::LUT);
|
||||
port(ID::A, param(ID::WIDTH));
|
||||
|
@ -2444,6 +2460,26 @@ DEF_METHOD(Mux, ID($mux), 0)
|
|||
DEF_METHOD(Pmux, ID($pmux), 1)
|
||||
#undef DEF_METHOD
|
||||
|
||||
#define DEF_METHOD(_func, _type, _demux) \
|
||||
RTLIL::Cell* RTLIL::Module::add ## _func(RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_s, const RTLIL::SigSpec &sig_y, const std::string &src) { \
|
||||
RTLIL::Cell *cell = addCell(name, _type); \
|
||||
cell->parameters[ID::WIDTH] = _demux ? sig_a.size() : sig_y.size(); \
|
||||
cell->parameters[ID::S_WIDTH] = sig_s.size(); \
|
||||
cell->setPort(ID::A, sig_a); \
|
||||
cell->setPort(ID::S, sig_s); \
|
||||
cell->setPort(ID::Y, sig_y); \
|
||||
cell->set_src_attribute(src); \
|
||||
return cell; \
|
||||
} \
|
||||
RTLIL::SigSpec RTLIL::Module::_func(RTLIL::IdString name, const RTLIL::SigSpec &sig_a, const RTLIL::SigSpec &sig_s, const std::string &src) { \
|
||||
RTLIL::SigSpec sig_y = addWire(NEW_ID, _demux ? sig_a.size() << sig_s.size() : sig_a.size() >> sig_s.size()); \
|
||||
add ## _func(name, sig_a, sig_s, sig_y, src); \
|
||||
return sig_y; \
|
||||
}
|
||||
DEF_METHOD(Bmux, ID($bmux), 0)
|
||||
DEF_METHOD(Demux, ID($demux), 1)
|
||||
#undef DEF_METHOD
|
||||
|
||||
#define DEF_METHOD_2(_func, _type, _P1, _P2) \
|
||||
RTLIL::Cell* RTLIL::Module::add ## _func(RTLIL::IdString name, const RTLIL::SigBit &sig1, const RTLIL::SigBit &sig2, const std::string &src) { \
|
||||
RTLIL::Cell *cell = addCell(name, _type); \
|
||||
|
@ -3358,14 +3394,21 @@ void RTLIL::Cell::fixup_parameters(bool set_a_signed, bool set_b_signed)
|
|||
type.begins_with("$verific$") || type.begins_with("$array:") || type.begins_with("$extern:"))
|
||||
return;
|
||||
|
||||
if (type == ID($mux) || type == ID($pmux)) {
|
||||
if (type == ID($mux) || type == ID($pmux) || type == ID($bmux)) {
|
||||
parameters[ID::WIDTH] = GetSize(connections_[ID::Y]);
|
||||
if (type == ID($pmux))
|
||||
if (type != ID($mux))
|
||||
parameters[ID::S_WIDTH] = GetSize(connections_[ID::S]);
|
||||
check();
|
||||
return;
|
||||
}
|
||||
|
||||
if (type == ID($demux)) {
|
||||
parameters[ID::WIDTH] = GetSize(connections_[ID::A]);
|
||||
parameters[ID::S_WIDTH] = GetSize(connections_[ID::S]);
|
||||
check();
|
||||
return;
|
||||
}
|
||||
|
||||
if (type == ID($lut) || type == ID($sop)) {
|
||||
parameters[ID::WIDTH] = GetSize(connections_[ID::A]);
|
||||
return;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue