Add arch API function for pip inversion

This commit is contained in:
Lofty 2025-02-03 12:38:34 +00:00
parent e4115e85f7
commit e2307a37b2
6 changed files with 28 additions and 7 deletions

View File

@ -102,6 +102,7 @@ template <typename R> struct ArchAPI : BaseCtx
virtual WireId getPipDstWire(PipId pip) const = 0; virtual WireId getPipDstWire(PipId pip) const = 0;
virtual DelayQuad getPipDelay(PipId pip) const = 0; virtual DelayQuad getPipDelay(PipId pip) const = 0;
virtual Loc getPipLocation(PipId pip) const = 0; virtual Loc getPipLocation(PipId pip) const = 0;
virtual bool isPipInverting(PipId pip) const = 0;
// Group methods // Group methods
virtual GroupId getGroupByName(IdStringList name) const = 0; virtual GroupId getGroupByName(IdStringList name) const = 0;
virtual IdStringList getGroupName(GroupId group) const = 0; virtual IdStringList getGroupName(GroupId group) const = 0;

View File

@ -288,6 +288,7 @@ template <typename R> struct BaseArch : ArchAPI<R>
} }
virtual WireId getConflictingPipWire(PipId /*pip*/) const override { return WireId(); } virtual WireId getConflictingPipWire(PipId /*pip*/) const override { return WireId(); }
virtual NetInfo *getConflictingPipNet(PipId pip) const override { return getBoundPipNet(pip); } virtual NetInfo *getConflictingPipNet(PipId pip) const override { return getBoundPipNet(pip); }
virtual bool isPipInverting(PipId /*pip*/) const override { return false; }
// Group methods // Group methods
virtual GroupId getGroupByName(IdStringList /*name*/) const override { return GroupId(); }; virtual GroupId getGroupByName(IdStringList /*name*/) const override { return GroupId(); };

View File

@ -417,6 +417,12 @@ pip is already bound to that net.
*BaseArch default: returns `getBoundPipNet(pip) == nullptr || getBoundPipNet(pip) == net`* *BaseArch default: returns `getBoundPipNet(pip) == nullptr || getBoundPipNet(pip) == net`*
### bool isPipInverting(PipId pip) const
Returns true if the given pip inverts the net passing through it.
*BaseArch default: returns `false`*
### NetInfo \*getBoundPipNet(PipId pip) const ### NetInfo \*getBoundPipNet(PipId pip) const
Return the net this pip is bound to. Return the net this pip is bound to.

View File

@ -285,24 +285,33 @@ IdStringList Arch::getWireName(WireId wire) const
PipId Arch::getPipByName(IdStringList name) const PipId Arch::getPipByName(IdStringList name) const
{ {
NPNR_ASSERT(name.size() == 3); NPNR_ASSERT(name.size() == 3 || (name.size() == 4 && name[3] == id("INV")));
int tile = tile_name2idx.at(name[0]); const int tile = tile_name2idx.at(name[0]);
const auto &tdata = chip_tile_info(chip_info, tile); const auto &tdata = chip_tile_info(chip_info, tile);
for (int pip = 0; pip < tdata.pips.ssize(); pip++) { for (int pip = 0; pip < tdata.pips.ssize(); pip++) {
if (IdString(tdata.wires[tdata.pips[pip].dst_wire].name) == name[1] && if (IdString(tdata.wires[tdata.pips[pip].dst_wire].name) == name[1] &&
IdString(tdata.wires[tdata.pips[pip].src_wire].name) == name[2]) IdString(tdata.wires[tdata.pips[pip].src_wire].name) == name[2]) {
return PipId(tile, pip);
const auto tmp_pip = PipId(tile, pip);
if ((name.size() == 3 && !isPipInverting(tmp_pip)) ||
(name.size() == 4 && isPipInverting(tmp_pip))) {
return tmp_pip;
}
}
} }
return PipId(); return PipId();
} }
IdStringList Arch::getPipName(PipId pip) const IdStringList Arch::getPipName(PipId pip) const
{ {
auto &tdata = chip_tile_info(chip_info, pip.tile); const auto &tdata = chip_tile_info(chip_info, pip.tile);
auto &pdata = tdata.pips[pip.index]; const auto &pdata = tdata.pips[pip.index];
return IdStringList::concat(tile_name.at(pip.tile), const auto name = IdStringList::concat(tile_name.at(pip.tile),
IdStringList::concat(IdString(tdata.wires[pdata.dst_wire].name), IdStringList::concat(IdString(tdata.wires[pdata.dst_wire].name),
IdString(tdata.wires[pdata.src_wire].name))); IdString(tdata.wires[pdata.src_wire].name)));
if (isPipInverting(pip))
return IdStringList::concat(name, id("INV"));
return name;
} }
IdString Arch::getPipType(PipId pip) const { return IdString(); } IdString Arch::getPipType(PipId pip) const { return IdString(); }

View File

@ -662,6 +662,9 @@ struct Arch : BaseArch<ArchRanges>
uarch->notifyPipChange(pip, nullptr); uarch->notifyPipChange(pip, nullptr);
BaseArch::unbindPip(pip); BaseArch::unbindPip(pip);
} }
bool isPipInverting(PipId pip) const override {
return uarch->isPipInverting(pip);
}
// ------------------------------------------------- // -------------------------------------------------

View File

@ -89,6 +89,7 @@ struct HimbaechelAPI
virtual bool checkWireAvail(WireId wire) const { return true; } virtual bool checkWireAvail(WireId wire) const { return true; }
virtual bool checkPipAvail(PipId pip) const { return true; } virtual bool checkPipAvail(PipId pip) const { return true; }
virtual bool checkPipAvailForNet(PipId pip, const NetInfo *net) const { return checkPipAvail(pip); }; virtual bool checkPipAvailForNet(PipId pip, const NetInfo *net) const { return checkPipAvail(pip); };
virtual bool isPipInverting(PipId pip) const { return false; }
// --- Route lookahead --- // --- Route lookahead ---
virtual delay_t estimateDelay(WireId src, WireId dst) const; virtual delay_t estimateDelay(WireId src, WireId dst) const;