SigSpec::extract() to return as many bits as poss if out of bounds

This commit is contained in:
Eddie Hung 2019-07-22 16:10:21 -07:00
parent 4d71ab384d
commit 8c31441ba0
1 changed files with 7 additions and 1 deletions

View File

@ -3354,7 +3354,13 @@ RTLIL::SigSpec RTLIL::SigSpec::extract(int offset, int length) const
{ {
unpack(); unpack();
cover("kernel.rtlil.sigspec.extract_pos"); cover("kernel.rtlil.sigspec.extract_pos");
return std::vector<RTLIL::SigBit>(bits_.begin() + offset, length >= 0 ? bits_.begin() + offset + length : bits_.end() + length + 1); auto it = bits_.begin() + std::min<int>(offset, width_);
decltype(it) ie;
if (length >= 0)
ie = bits_.begin() + std::min<int>(offset + length, width_);
else
ie = bits_.end() + std::max<int>(length + 1, offset - width_);
return std::vector<RTLIL::SigBit>(it, ie);
} }
void RTLIL::SigSpec::append(const RTLIL::SigSpec &signal) void RTLIL::SigSpec::append(const RTLIL::SigSpec &signal)