From 6575bfac3ec6cbf38f4525f997f07ccbaaa043f9 Mon Sep 17 00:00:00 2001 From: "D. Shah" Date: Fri, 5 Feb 2021 13:46:56 +0000 Subject: [PATCH] gowin: Switch to BaseArch Signed-off-by: D. Shah --- gowin/arch.cc | 42 +---------- gowin/arch.h | 205 ++++++++++++++++++++++++-------------------------- 2 files changed, 102 insertions(+), 145 deletions(-) diff --git a/gowin/arch.cc b/gowin/arch.cc index e266c9b5..d4e17a8a 100644 --- a/gowin/arch.cc +++ b/gowin/arch.cc @@ -736,17 +736,8 @@ Arch::Arch(ArchArgs args) : args(args) } } } - // Dummy for empty decals - decal_graphics[IdString()]; - - std::unordered_set bel_types; - for (BelId bel : getBels()) { - bel_types.insert(getBelType(bel)); - } - - for (IdString bel_type : bel_types) { - cell_types.push_back(bel_type); - } + BaseArch::init_cell_types(); + BaseArch::init_bel_buckets(); } void IdString::initialize_arch(const BaseCtx *ctx) @@ -785,8 +776,6 @@ const std::vector &Arch::getBelsByTile(int x, int y) const { return bels_ bool Arch::getBelGlobalBuf(BelId bel) const { return bels.at(bel).gb; } -uint32_t Arch::getBelChecksum(BelId bel) const { return bel.index; } - void Arch::bindBel(BelId bel, CellInfo *cell, PlaceStrength strength) { bels.at(bel).bound_cell = cell; @@ -848,12 +837,6 @@ IdString Arch::getWireType(WireId wire) const { return wires.at(wire).type; } const std::map &Arch::getWireAttrs(WireId wire) const { return wires.at(wire).attrs; } -uint32_t Arch::getWireChecksum(WireId wire) const -{ - // FIXME - return 0; -} - void Arch::bindWire(WireId wire, NetInfo *net, PlaceStrength strength) { wires.at(wire).bound_net = net; @@ -902,8 +885,6 @@ IdString Arch::getPipType(PipId pip) const { return pips.at(pip).type; } const std::map &Arch::getPipAttrs(PipId pip) const { return pips.at(pip).attrs; } -uint32_t Arch::getPipChecksum(PipId wire) const { return wire.index; } - void Arch::bindPip(PipId pip, NetInfo *net, PlaceStrength strength) { WireId wire = pips.at(pip).dstWire; @@ -1074,25 +1055,6 @@ bool Arch::route() // --------------------------------------------------------------- -const std::vector &Arch::getDecalGraphics(DecalId decal) const -{ - if (!decal_graphics.count(decal)) { - std::cerr << "No decal named " << decal.str(this) << std::endl; - log_error("No decal named %s!\n", decal.c_str(this)); - } - return decal_graphics.at(decal); -} - -DecalXY Arch::getBelDecal(BelId bel) const { return bels.at(bel).decalxy; } - -DecalXY Arch::getWireDecal(WireId wire) const { return wires.at(wire).decalxy; } - -DecalXY Arch::getPipDecal(PipId pip) const { return pips.at(pip).decalxy; } - -DecalXY Arch::getGroupDecal(GroupId group) const { return groups.at(group).decalxy; } - -// --------------------------------------------------------------- - bool Arch::getCellDelay(const CellInfo *cell, IdString fromPort, IdString toPort, DelayInfo &delay) const { if (!cellTiming.count(cell->name)) diff --git a/gowin/arch.h b/gowin/arch.h index 4754772b..8f41657c 100644 --- a/gowin/arch.h +++ b/gowin/arch.h @@ -243,7 +243,37 @@ struct CellTiming std::unordered_map> clockingInfo; }; -struct Arch : BaseCtx +struct ArchRanges +{ + // Bels + using AllBelsRange = const std::vector &; + using TileBelsRange = const std::vector &; + using BelAttrsRange = const std::map &; + using BelPinsRange = std::vector; + // Wires + using AllWiresRange = const std::vector &; + using DownhillPipRange = const std::vector &; + using UphillPipRange = const std::vector &; + using WireBelPinRange = const std::vector &; + using WireAttrsRange = const std::map &; + // Pips + using AllPipsRange = const std::vector &; + using PipAttrsRange = const std::map &; + // Groups + using AllGroupsRange = std::vector; + using GroupBelsRange = const std::vector &; + using GroupWiresRange = const std::vector &; + using GroupPipsRange = const std::vector &; + using GroupGroupsRange = const std::vector &; + // Decals + using DecalGfxRange = const std::vector &; + // Placement validity + using CellTypeRange = std::vector; + using BelBucketRange = std::vector; + using BucketBelRange = std::vector; +}; + +struct Arch : BaseArch { std::string family; std::string device; @@ -313,14 +343,13 @@ struct Arch : BaseCtx ArchArgs args; Arch(ArchArgs args); - std::string getChipName() const { return device; } + std::string getChipName() const override { return device; } - IdString archId() const { return id("gowin"); } ArchArgs archArgs() const { return args; } IdString archArgsToId(ArchArgs args) const { return id("none"); } - int getGridDimX() const { return gridDimX; } - int getGridDimY() const { return gridDimY; } + int getGridDimX() const override { return gridDimX; } + int getGridDimY() const override { return gridDimY; } int getTileBelDimZ(int x, int y) const { return tileBelDimZ[x][y]; } int getTilePipDimZ(int x, int y) const { return tilePipDimZ[x][y]; } char getNameDelimiter() const @@ -328,74 +357,71 @@ struct Arch : BaseCtx return ' '; /* use a non-existent delimiter as we aren't using IdStringLists yet */ } - BelId getBelByName(IdStringList name) const; - IdStringList getBelName(BelId bel) const; - Loc getBelLocation(BelId bel) const; - BelId getBelByLocation(Loc loc) const; - const std::vector &getBelsByTile(int x, int y) const; - bool getBelGlobalBuf(BelId bel) const; - uint32_t getBelChecksum(BelId bel) const; - void bindBel(BelId bel, CellInfo *cell, PlaceStrength strength); - void unbindBel(BelId bel); - bool checkBelAvail(BelId bel) const; - CellInfo *getBoundBelCell(BelId bel) const; - CellInfo *getConflictingBelCell(BelId bel) const; - const std::vector &getBels() const; - IdString getBelType(BelId bel) const; - const std::map &getBelAttrs(BelId bel) const; - WireId getBelPinWire(BelId bel, IdString pin) const; - PortType getBelPinType(BelId bel, IdString pin) const; - std::vector getBelPins(BelId bel) const; + BelId getBelByName(IdStringList name) const override; + IdStringList getBelName(BelId bel) const override; + Loc getBelLocation(BelId bel) const override; + BelId getBelByLocation(Loc loc) const override; + const std::vector &getBelsByTile(int x, int y) const override; + bool getBelGlobalBuf(BelId bel) const override; + void bindBel(BelId bel, CellInfo *cell, PlaceStrength strength) override; + void unbindBel(BelId bel) override; + bool checkBelAvail(BelId bel) const override; + CellInfo *getBoundBelCell(BelId bel) const override; + CellInfo *getConflictingBelCell(BelId bel) const override; + const std::vector &getBels() const override; + IdString getBelType(BelId bel) const override; + const std::map &getBelAttrs(BelId bel) const override; + WireId getBelPinWire(BelId bel, IdString pin) const override; + PortType getBelPinType(BelId bel, IdString pin) const override; + std::vector getBelPins(BelId bel) const override; - WireId getWireByName(IdStringList name) const; - IdStringList getWireName(WireId wire) const; - IdString getWireType(WireId wire) const; - const std::map &getWireAttrs(WireId wire) const; - uint32_t getWireChecksum(WireId wire) const; - void bindWire(WireId wire, NetInfo *net, PlaceStrength strength); - void unbindWire(WireId wire); - bool checkWireAvail(WireId wire) const; - NetInfo *getBoundWireNet(WireId wire) const; - WireId getConflictingWireWire(WireId wire) const { return wire; } - NetInfo *getConflictingWireNet(WireId wire) const; - DelayInfo getWireDelay(WireId wire) const { return DelayInfo(); } - const std::vector &getWires() const; - const std::vector &getWireBelPins(WireId wire) const; + WireId getWireByName(IdStringList name) const override; + IdStringList getWireName(WireId wire) const override; + IdString getWireType(WireId wire) const override; + const std::map &getWireAttrs(WireId wire) const override; + void bindWire(WireId wire, NetInfo *net, PlaceStrength strength) override; + void unbindWire(WireId wire) override; + bool checkWireAvail(WireId wire) const override; + NetInfo *getBoundWireNet(WireId wire) const override; + WireId getConflictingWireWire(WireId wire) const override { return wire; } + NetInfo *getConflictingWireNet(WireId wire) const override; + DelayInfo getWireDelay(WireId wire) const override { return DelayInfo(); } + const std::vector &getWires() const override; + const std::vector &getWireBelPins(WireId wire) const override; - PipId getPipByName(IdStringList name) const; - IdStringList getPipName(PipId pip) const; - IdString getPipType(PipId pip) const; - const std::map &getPipAttrs(PipId pip) const; - uint32_t getPipChecksum(PipId pip) const; - void bindPip(PipId pip, NetInfo *net, PlaceStrength strength); - void unbindPip(PipId pip); - bool checkPipAvail(PipId pip) const; - NetInfo *getBoundPipNet(PipId pip) const; - WireId getConflictingPipWire(PipId pip) const; - NetInfo *getConflictingPipNet(PipId pip) const; - const std::vector &getPips() const; - Loc getPipLocation(PipId pip) const; - WireId getPipSrcWire(PipId pip) const; - WireId getPipDstWire(PipId pip) const; - DelayInfo getPipDelay(PipId pip) const; - const std::vector &getPipsDownhill(WireId wire) const; - const std::vector &getPipsUphill(WireId wire) const; + PipId getPipByName(IdStringList name) const override; + IdStringList getPipName(PipId pip) const override; + IdString getPipType(PipId pip) const override; + const std::map &getPipAttrs(PipId pip) const override; + void bindPip(PipId pip, NetInfo *net, PlaceStrength strength) override; + void unbindPip(PipId pip) override; + bool checkPipAvail(PipId pip) const override; + NetInfo *getBoundPipNet(PipId pip) const override; + WireId getConflictingPipWire(PipId pip) const override; + NetInfo *getConflictingPipNet(PipId pip) const override; + const std::vector &getPips() const override; + Loc getPipLocation(PipId pip) const override; + WireId getPipSrcWire(PipId pip) const override; + WireId getPipDstWire(PipId pip) const override; + DelayInfo getPipDelay(PipId pip) const override; + const std::vector &getPipsDownhill(WireId wire) const override; + const std::vector &getPipsUphill(WireId wire) const override; - GroupId getGroupByName(IdStringList name) const; - IdStringList getGroupName(GroupId group) const; - std::vector getGroups() const; - const std::vector &getGroupBels(GroupId group) const; - const std::vector &getGroupWires(GroupId group) const; - const std::vector &getGroupPips(GroupId group) const; - const std::vector &getGroupGroups(GroupId group) const; + GroupId getGroupByName(IdStringList name) const override; + IdStringList getGroupName(GroupId group) const override; + std::vector getGroups() const override; + const std::vector &getGroupBels(GroupId group) const override; + const std::vector &getGroupWires(GroupId group) const override; + const std::vector &getGroupPips(GroupId group) const override; + const std::vector &getGroupGroups(GroupId group) const override; - delay_t estimateDelay(WireId src, WireId dst) const; - delay_t predictDelay(const NetInfo *net_info, const PortRef &sink) const; - delay_t getDelayEpsilon() const { return 0.01; } - delay_t getRipupDelayPenalty() const { return 0.4; } - float getDelayNS(delay_t v) const { return v; } + delay_t estimateDelay(WireId src, WireId dst) const override; + delay_t predictDelay(const NetInfo *net_info, const PortRef &sink) const override; + delay_t getDelayEpsilon() const override { return 0.01; } + delay_t getRipupDelayPenalty() const override { return 0.4; } + float getDelayNS(delay_t v) const override { return v; } - DelayInfo getDelayFromNS(float ns) const + DelayInfo getDelayFromNS(float ns) const override { DelayInfo del; del.maxRaise = ns; @@ -405,20 +431,14 @@ struct Arch : BaseCtx return del; } - uint32_t getDelayChecksum(delay_t v) const { return 0; } - bool getBudgetOverride(const NetInfo *net_info, const PortRef &sink, delay_t &budget) const; + uint32_t getDelayChecksum(delay_t v) const override { return 0; } + bool getBudgetOverride(const NetInfo *net_info, const PortRef &sink, delay_t &budget) const override; - ArcBounds getRouteBoundingBox(WireId src, WireId dst) const; + ArcBounds getRouteBoundingBox(WireId src, WireId dst) const override; - bool pack(); - bool place(); - bool route(); - - const std::vector &getDecalGraphics(DecalId decal) const; - DecalXY getBelDecal(BelId bel) const; - DecalXY getWireDecal(WireId wire) const; - DecalXY getPipDecal(PipId pip) const; - DecalXY getGroupDecal(GroupId group) const; + bool pack() override; + bool place() override; + bool route() override; bool getCellDelay(const CellInfo *cell, IdString fromPort, IdString toPort, DelayInfo &delay) const; // Get the port class, also setting clockInfoCount to the number of TimingClockingInfos associated with a port @@ -426,31 +446,6 @@ struct Arch : BaseCtx // Get the TimingClockingInfo of a port TimingClockingInfo getPortClockingInfo(const CellInfo *cell, IdString port, int index) const; - bool isValidBelForCellType(IdString cell_type, BelId bel) const { return cell_type == getBelType(bel); } - - const std::vector &getCellTypes() const { return cell_types; } - - std::vector getBelBuckets() const { return cell_types; } - - IdString getBelBucketName(BelBucketId bucket) const { return bucket; } - - BelBucketId getBelBucketByName(IdString name) const { return name; } - - BelBucketId getBelBucketForBel(BelId bel) const { return getBelType(bel); } - - BelBucketId getBelBucketForCellType(IdString cell_type) const { return cell_type; } - - std::vector getBelsInBucket(BelBucketId bucket) const - { - std::vector bels; - for (BelId bel : getBels()) { - if (getBelType(bel) == bucket) { - bels.push_back(bel); - } - } - return bels; - } - bool isValidBelForCell(CellInfo *cell, BelId bel) const; bool isBelLocationValid(BelId bel) const;