3
0
Fork 0
mirror of https://github.com/YosysHQ/yosys synced 2025-06-14 09:56:16 +00:00

Do not SigSpec::extract() beyond bounds

This commit is contained in:
Eddie Hung 2019-08-07 13:58:26 -07:00
parent e3d898dccb
commit d90b8b081a
2 changed files with 10 additions and 8 deletions

View file

@ -224,11 +224,11 @@ void create_ice40_dsp(ice40_dsp_pm &pm)
pm.autoremove(st.ffH); pm.autoremove(st.ffH);
pm.autoremove(st.addAB); pm.autoremove(st.addAB);
if (st.ffO_lo) { if (st.ffO_lo) {
SigSpec O = st.sigO.extract(0,16); SigSpec O = st.sigO.extract(0,GetSize(st.ffO_lo));
st.ffO_lo->connections_.at("\\Q").replace(O, pm.module->addWire(NEW_ID, GetSize(O))); st.ffO_lo->connections_.at("\\Q").replace(O, pm.module->addWire(NEW_ID, GetSize(O)));
} }
if (st.ffO_hi) { if (st.ffO_hi) {
SigSpec O = st.sigO.extract(16,16); SigSpec O = st.sigO.extract(16,GetSize(st.ffo_hi));
st.ffO_hi->connections_.at("\\Q").replace(O, pm.module->addWire(NEW_ID, GetSize(O))); st.ffO_hi->connections_.at("\\Q").replace(O, pm.module->addWire(NEW_ID, GetSize(O)));
} }
} }

View file

@ -156,15 +156,17 @@ endcode
match ffO_lo match ffO_lo
select ffO_lo->type.in($dff) select ffO_lo->type.in($dff)
filter nusers(sigO.extract(0,16)) == 2 filter GetSize(sigO) >= param(ffO_lo, \WIDTH).as_int()
filter includes(port(ffO_lo, \D).to_sigbit_set(), sigO.extract(0,16).to_sigbit_set()) filter nusers(sigO.extract(0,param(ffO_lo, \WIDTH).as_int())) == 2
filter includes(port(ffO_lo, \D).to_sigbit_set(), sigO.extract(0,param(ffO_lo, \WIDTH).as_int()).to_sigbit_set())
optional optional
endmatch endmatch
match ffO_hi match ffO_hi
select ffO_hi->type.in($dff) select ffO_hi->type.in($dff)
filter nusers(sigO.extract(16,16)) == 2 filter GetSize(sigO) >= 16+param(ffO_hi, \WIDTH).as_int()
filter includes(port(ffO_hi, \D).to_sigbit_set(), sigO.extract(16,16).to_sigbit_set()) filter nusers(sigO.extract(16,param(ffO_hi, \WIDTH).as_int())) == 2
filter includes(port(ffO_hi, \D).to_sigbit_set(), sigO.extract(16,param(ffO_hi, \WIDTH).as_int()).to_sigbit_set())
optional optional
endmatch endmatch
@ -184,7 +186,7 @@ code clock clock_pol sigO sigCD
clock = c; clock = c;
clock_pol = cp; clock_pol = cp;
if (port(ffO_lo, \Q) != sigO.extract(0,16)) if (port(ffO_lo, \Q) != sigO.extract(0,param(ffO_lo, \WIDTH).as_int()))
sigO.replace(port(ffO_lo, \D), port(ffO_lo, \Q)); sigO.replace(port(ffO_lo, \D), port(ffO_lo, \Q));
} }
@ -202,7 +204,7 @@ code clock clock_pol sigO sigCD
clock = c; clock = c;
clock_pol = cp; clock_pol = cp;
if (port(ffO_hi, \Q) != sigO.extract(16,16)) if (port(ffO_hi, \Q) != sigO.extract(16,param(ffO_hi, \WIDTH).as_int()))
sigO.replace(port(ffO_hi, \D), port(ffO_hi, \Q)); sigO.replace(port(ffO_hi, \D), port(ffO_hi, \Q));
} }