ice40: Lock out mutually exclusive pips

Signed-off-by: David Shah <davey1576@gmail.com>
This commit is contained in:
David Shah 2018-06-10 12:17:55 +02:00
parent 827a43c88c
commit 6da8f98eac
2 changed files with 13 additions and 2 deletions

View File

@ -97,6 +97,7 @@ Chip::Chip(ChipArgs args) : args(args)
bel_to_cell.resize(chip_info.num_bels); bel_to_cell.resize(chip_info.num_bels);
wire_to_net.resize(chip_info.num_wires); wire_to_net.resize(chip_info.num_wires);
pip_to_net.resize(chip_info.num_pips); pip_to_net.resize(chip_info.num_pips);
pips_locked.resize(chip_info.num_pips);
} }
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------

View File

@ -404,7 +404,7 @@ struct Chip
vector<IdString> bel_to_cell; vector<IdString> bel_to_cell;
vector<IdString> wire_to_net; vector<IdString> wire_to_net;
vector<IdString> pip_to_net; vector<IdString> pip_to_net;
vector<bool> pips_locked;
Chip(ChipArgs args); Chip(ChipArgs args);
ChipArgs args; ChipArgs args;
@ -561,6 +561,11 @@ struct Chip
assert(pip != PipId()); assert(pip != PipId());
assert(pip_to_net[pip.index] == IdString()); assert(pip_to_net[pip.index] == IdString());
pip_to_net[pip.index] = net; pip_to_net[pip.index] = net;
// Optimise?
for (int i = 0; i < chip_info.num_pips; i++) {
if (chip_info.pip_data[i].switch_index == chip_info.pip_data[pip.index].switch_index)
pips_locked[i] = true;
}
} }
void unbindPip(PipId pip) void unbindPip(PipId pip)
@ -568,12 +573,17 @@ struct Chip
assert(pip != PipId()); assert(pip != PipId());
assert(pip_to_net[pip.index] != IdString()); assert(pip_to_net[pip.index] != IdString());
pip_to_net[pip.index] = IdString(); pip_to_net[pip.index] = IdString();
// Optimise?
for (int i = 0; i < chip_info.num_pips; i++) {
if (chip_info.pip_data[i].switch_index == chip_info.pip_data[pip.index].switch_index)
pips_locked[i] = false;
}
} }
bool checkPipAvail(PipId pip) const bool checkPipAvail(PipId pip) const
{ {
assert(pip != PipId()); assert(pip != PipId());
return pip_to_net[pip.index] == IdString(); return !pips_locked[pip.index];
} }
IdString getPipNet(PipId pip) const IdString getPipNet(PipId pip) const