diff options
Diffstat (limited to 'kernel/rtlil.cc')
| -rw-r--r-- | kernel/rtlil.cc | 47 | 
1 files changed, 45 insertions, 2 deletions
diff --git a/kernel/rtlil.cc b/kernel/rtlil.cc index cd0f5ab12..a89edd992 100644 --- a/kernel/rtlil.cc +++ b/kernel/rtlil.cc @@ -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;  | 
