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:
parent
ab525643a7
commit
1af5d4f2db
1 changed files with 19 additions and 25 deletions
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue