Skip to content

Commit

Permalink
rtlil: add Const::compress helper function
Browse files Browse the repository at this point in the history
Compresses the current bits to the minimum
width representation by removing leading bits.
  • Loading branch information
phsauter committed Sep 19, 2024
1 parent 4d581a9 commit fafb73a
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 0 deletions.
24 changes: 24 additions & 0 deletions kernel/rtlil.cc
Original file line number Diff line number Diff line change
Expand Up @@ -280,6 +280,30 @@ int RTLIL::Const::as_int(bool is_signed) const
return ret;
}

void RTLIL::Const::compress(bool is_signed)
{
if (bits.empty()) return;

// back to front (MSB to LSB)
RTLIL::State leading_bit;
if(is_signed)
leading_bit = (bits.back() == RTLIL::State::Sx) ? RTLIL::State::S0 : bits.back();
else
leading_bit = RTLIL::State::S0;

size_t idx = bits.size();
while (idx > 0 && bits[idx -1] == leading_bit) {
--idx;
}

// signed needs one leading bit
if (is_signed && idx < bits.size()) {
++idx;
}

bits.erase(bits.begin() + idx, bits.end());
}

std::string RTLIL::Const::as_string() const
{
std::string ret;
Expand Down
3 changes: 3 additions & 0 deletions kernel/rtlil.h
Original file line number Diff line number Diff line change
Expand Up @@ -703,6 +703,9 @@ struct RTLIL::Const
return ret;
}

// compress representation to the minimum required bits
void compress(bool is_signed = false);

void extu(int width) {
bits.resize(width, RTLIL::State::S0);
}
Expand Down

0 comments on commit fafb73a

Please sign in to comment.