diff options
author | William D. Jones <thor0505@comcast.net> | 2021-01-28 03:16:57 -0500 |
---|---|---|
committer | gatecat <gatecat@ds0.me> | 2021-02-12 10:36:59 +0000 |
commit | 861c12e6eba1ae1c0d6b1ea0ed27c060b2ceb671 (patch) | |
tree | 5659a5fd8d1b029cc789c4717e5ec0dc3b41aa9a | |
parent | 0adde4aede134f5ed37d1fc0f081a7eaf325c7ee (diff) | |
download | nextpnr-861c12e6eba1ae1c0d6b1ea0ed27c060b2ceb671.tar.gz nextpnr-861c12e6eba1ae1c0d6b1ea0ed27c060b2ceb671.tar.bz2 nextpnr-861c12e6eba1ae1c0d6b1ea0ed27c060b2ceb671.zip |
machxo2: Finish implementing Pip API functions.
-rw-r--r-- | machxo2/arch.cc | 18 | ||||
-rw-r--r-- | machxo2/arch.h | 76 |
2 files changed, 67 insertions, 27 deletions
diff --git a/machxo2/arch.cc b/machxo2/arch.cc index 0f1a0670..eb050598 100644 --- a/machxo2/arch.cc +++ b/machxo2/arch.cc @@ -351,24 +351,6 @@ IdString Arch::getPipName(PipId pip) const return id("X" + std::to_string(x) + "/Y" + std::to_string(y) + "/" + src_name + ".->." + dst_name); } -NetInfo *Arch::getBoundPipNet(PipId pip) const { return nullptr; } - -NetInfo *Arch::getConflictingPipNet(PipId pip) const { return nullptr; } - -WireId Arch::getConflictingPipWire(PipId pip) const { return WireId(); } - -const std::vector<PipId> &Arch::getPips() const { return pip_id_dummy; } - -Loc Arch::getPipLocation(PipId pip) const { return Loc(); } - -DelayInfo Arch::getPipDelay(PipId pip) const { return DelayInfo(); } - -const std::vector<PipId> &Arch::getPipsDownhill(WireId wire) const { return pip_id_dummy; } - -const std::vector<PipId> &Arch::getPipsUphill(WireId wire) const { return pip_id_dummy; } - -const std::vector<PipId> &Arch::getWireAliases(WireId wire) const { return pip_id_dummy; } - // --------------------------------------------------------------- GroupId Arch::getGroupByName(IdString name) const { return GroupId(); } diff --git a/machxo2/arch.h b/machxo2/arch.h index b87d622c..560099aa 100644 --- a/machxo2/arch.h +++ b/machxo2/arch.h @@ -748,11 +748,50 @@ struct Arch : BaseCtx return pip_to_net.find(pip) == pip_to_net.end() || pip_to_net.at(pip) == nullptr; } - NetInfo *getBoundPipNet(PipId pip) const; - WireId getConflictingPipWire(PipId pip) const; - NetInfo *getConflictingPipNet(PipId pip) const; - const std::vector<PipId> &getPips() const; - Loc getPipLocation(PipId pip) const; + NetInfo *getBoundPipNet(PipId pip) const + { + NPNR_ASSERT(pip != PipId()); + if (pip_to_net.find(pip) == pip_to_net.end()) + return nullptr; + else + return pip_to_net.at(pip); + } + + WireId getConflictingPipWire(PipId pip) const { return WireId(); } + + NetInfo *getConflictingPipNet(PipId pip) const + { + NPNR_ASSERT(pip != PipId()); + if (pip_to_net.find(pip) == pip_to_net.end()) + return nullptr; + else + return pip_to_net.at(pip); + } + + AllPipRange getPips() const + { + AllPipRange range; + range.b.cursor_tile = 0; + range.b.cursor_index = -1; + range.b.chip = chip_info; + ++range.b; //-1 and then ++ deals with the case of no Bels in the first tile + range.e.cursor_tile = chip_info->width * chip_info->height; + range.e.cursor_index = 0; + range.e.chip = chip_info; + return range; + } + + Loc getPipLocation(PipId pip) const + { + Loc loc; + loc.x = pip.location.x; + loc.y = pip.location.y; + + // FIXME: Some Pip's config bits span across tiles. Will Z + // be affected by this? + loc.z = 0; + return loc; + } WireId getPipSrcWire(PipId pip) const { @@ -772,10 +811,29 @@ struct Arch : BaseCtx return wire; } - DelayInfo getPipDelay(PipId pip) const; - const std::vector<PipId> &getPipsDownhill(WireId wire) const; - const std::vector<PipId> &getPipsUphill(WireId wire) const; - const std::vector<PipId> &getWireAliases(WireId wire) const; + DelayInfo getPipDelay(PipId pip) const { return DelayInfo(); } + + PipRange getPipsDownhill(WireId wire) const + { + PipRange range; + NPNR_ASSERT(wire != WireId()); + range.b.cursor = tileInfo(wire)->wire_data[wire.index].pips_downhill.get(); + range.b.wire_loc = wire.location; + range.e.cursor = range.b.cursor + tileInfo(wire)->wire_data[wire.index].num_downhill; + range.e.wire_loc = wire.location; + return range; + } + + PipRange getPipsUphill(WireId wire) const + { + PipRange range; + NPNR_ASSERT(wire != WireId()); + range.b.cursor = tileInfo(wire)->wire_data[wire.index].pips_uphill.get(); + range.b.wire_loc = wire.location; + range.e.cursor = range.b.cursor + tileInfo(wire)->wire_data[wire.index].num_uphill; + range.e.wire_loc = wire.location; + return range; + } // Group GroupId getGroupByName(IdString name) const; |