3
0
Fork 0
mirror of https://github.com/YosysHQ/yosys synced 2025-11-05 05:49:15 +00:00

Use chunks iterator for SigSpec::extract()

This commit is contained in:
Robert O'Callahan 2025-10-30 17:42:58 +00:00
parent ab525643a7
commit 1af5d4f2db

View file

@ -5166,33 +5166,27 @@ RTLIL::SigSpec RTLIL::SigSpec::extract(int offset, int length) const
cover("kernel.rtlil.sigspec.extract_pos"); cover("kernel.rtlil.sigspec.extract_pos");
if (packed()) { SigSpec extracted;
SigSpec extracted; Chunks cs = chunks();
extracted.width_ = length; auto it = cs.begin();
for (; offset; offset -= it->width, ++it) {
auto it = chunks_.begin(); if (offset < it->width) {
for (; offset; offset -= it->width, it++) { int chunk_length = min(it->width - offset, length);
if (offset < it->width) { extracted.append(it->extract(offset, chunk_length));
int chunk_length = min(it->width - offset, length); length -= chunk_length;
extracted.chunks_.emplace_back(it->extract(offset, chunk_length)); ++it;
length -= chunk_length; break;
it++;
break;
}
} }
for (; length; length -= it->width, it++) {
if (length >= it->width) {
extracted.chunks_.emplace_back(*it);
} else {
extracted.chunks_.emplace_back(it->extract(0, length));
break;
}
}
return extracted;
} else {
return std::vector<RTLIL::SigBit>(bits_.begin() + offset, bits_.begin() + offset + length);
} }
for (; length; length -= it->width, ++it) {
if (length >= it->width) {
extracted.append(*it);
} else {
extracted.append(it->extract(0, length));
break;
}
}
return extracted;
} }
void RTLIL::SigSpec::rewrite_wires(std::function<void(RTLIL::Wire*& wire)> rewrite) void RTLIL::SigSpec::rewrite_wires(std::function<void(RTLIL::Wire*& wire)> rewrite)