SigSpec::extract() to return as many bits as poss if out of bounds
authorEddie Hung <eddie@fpgeh.com>
Mon, 22 Jul 2019 23:10:21 +0000 (16:10 -0700)
committerEddie Hung <eddie@fpgeh.com>
Mon, 22 Jul 2019 23:10:21 +0000 (16:10 -0700)
kernel/rtlil.cc

index 5d992ef2d25b1e385a19d85cd39570c83166f52d..fd98ab4bdf8decc0f7fdf181e877b1fa68c9464b 100644 (file)
@@ -3354,7 +3354,13 @@ RTLIL::SigSpec RTLIL::SigSpec::extract(int offset, int length) const
 {
        unpack();
        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)