From 428f0b9ebaec7bd0cf86ecbc50d1edd3a7bf0c51 Mon Sep 17 00:00:00 2001 From: Clifford Wolf Date: Tue, 14 Aug 2018 17:16:14 +0200 Subject: [PATCH] Add Arch attrs API Signed-off-by: Clifford Wolf --- docs/archapi.md | 15 +++++++++++++++ ecp5/arch.h | 18 ++++++++++++++++++ generic/arch.cc | 21 +++++++++++++++++++++ generic/arch.h | 10 ++++++++++ ice40/arch.h | 18 ++++++++++++++++++ 5 files changed, 82 insertions(+) diff --git a/docs/archapi.md b/docs/archapi.md index 473cdd2e..73443c15 100644 --- a/docs/archapi.md +++ b/docs/archapi.md @@ -151,6 +151,11 @@ Return a list of all bels on the device. Return the type of a given bel. +### const\_range\\> getBelAttrs(BelId bel) const + +Return the attributes for that bel. Bel attributes are only informal. They are displayed by the GUI but are otherwise +unused. An implementation may simply return an empty range. + ### WireId getBelPinWire(BelId bel, IdString pin) const Return the wire connected to the given bel pin. @@ -180,6 +185,11 @@ Get the type of a wire. The wire type is purely informal and isn't used by any of the core algorithms. Implementations may simply return `IdString()`. +### const\_range\\> getWireAttrs(WireId wire) const + +Return the attributes for that wire. Wire attributes are only informal. They are displayed by the GUI but are otherwise +unused. An implementation may simply return an empty range. + ### uint32\_t getWireChecksum(WireId wire) const Return a (preferably unique) number that represents this wire. This is used in design state checksum calculations. @@ -242,6 +252,11 @@ Get the name for a pip. (Pip names must be unique.) Get the type of a pip. Pip types are purely informal and implementations may simply return `IdString()`. +### const\_range\\> getPipAttrs(PipId pip) const + +Return the attributes for that pip. Pip attributes are only informal. They are displayed by the GUI but are otherwise +unused. An implementation may simply return an empty range. + ### Loc getPipLocation(PipId pip) const Get the X/Y/Z location of a given pip. Pip locations do not need to be unique, and in most cases they aren't. So diff --git a/ecp5/arch.h b/ecp5/arch.h index 36792625..f5336e55 100644 --- a/ecp5/arch.h +++ b/ecp5/arch.h @@ -522,6 +522,12 @@ struct Arch : BaseCtx return id; } + std::vector> getBelAttrs(BelId) const + { + std::vector> ret; + return ret; + } + WireId getBelPinWire(BelId bel, IdString pin) const; BelPinRange getWireBelPins(WireId wire) const @@ -553,6 +559,12 @@ struct Arch : BaseCtx IdString getWireType(WireId wire) const { return IdString(); } + std::vector> getWireAttrs(WireId) const + { + std::vector> ret; + return ret; + } + uint32_t getWireChecksum(WireId wire) const { return wire.index; } void bindWire(WireId wire, NetInfo *net, PlaceStrength strength) @@ -633,6 +645,12 @@ struct Arch : BaseCtx IdString getPipType(PipId pip) const { return IdString(); } + std::vector> getPipAttrs(PipId) const + { + std::vector> ret; + return ret; + } + uint32_t getPipChecksum(PipId pip) const { return pip.index; } void bindPip(PipId pip, NetInfo *net, PlaceStrength strength) diff --git a/generic/arch.cc b/generic/arch.cc index d306a9ec..7f464206 100644 --- a/generic/arch.cc +++ b/generic/arch.cc @@ -184,6 +184,21 @@ void Arch::setGroupDecal(GroupId group, DecalXY decalxy) refreshUiGroup(group); } +void Arch::setWireAttr(IdString wire, IdString key, const std::string &value) +{ + wires.at(wire).attrs[key] = value; +} + +void Arch::setPipAttr(IdString pip, IdString key, const std::string &value) +{ + pips.at(pip).attrs[key] = value; +} + +void Arch::setBelAttr(IdString bel, IdString key, const std::string &value) +{ + bels.at(bel).attrs[key] = value; +} + // --------------------------------------------------------------- Arch::Arch(ArchArgs args) : chipName("generic"), args(args) {} @@ -251,6 +266,8 @@ const std::vector &Arch::getBels() const { return bel_ids; } IdString Arch::getBelType(BelId bel) const { return bels.at(bel).type; } +const std::map &Arch::getBelAttrs(BelId bel) const { return bels.at(bel).attrs; } + WireId Arch::getBelPinWire(BelId bel, IdString pin) const { return bels.at(bel).pins.at(pin).wire; } PortType Arch::getBelPinType(BelId bel, IdString pin) const { return bels.at(bel).pins.at(pin).type; } @@ -276,6 +293,8 @@ IdString Arch::getWireName(WireId wire) const { return wire; } 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 @@ -328,6 +347,8 @@ IdString Arch::getPipName(PipId pip) const { return pip; } 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 { // FIXME diff --git a/generic/arch.h b/generic/arch.h index 7549a75b..22966e2a 100644 --- a/generic/arch.h +++ b/generic/arch.h @@ -32,6 +32,7 @@ struct WireInfo; struct PipInfo { IdString name, type; + std::map attrs; NetInfo *bound_net; WireId srcWire, dstWire; DelayInfo delay; @@ -42,6 +43,7 @@ struct PipInfo struct WireInfo { IdString name, type; + std::map attrs; NetInfo *bound_net; std::vector downhill, uphill, aliases; BelPin uphill_bel_pin; @@ -61,6 +63,7 @@ struct PinInfo struct BelInfo { IdString name, type; + std::map attrs; CellInfo *bound_cell; std::unordered_map pins; DecalXY decalxy; @@ -120,6 +123,10 @@ struct Arch : BaseCtx void setBelDecal(BelId bel, DecalXY decalxy); void setGroupDecal(GroupId group, DecalXY decalxy); + void setWireAttr(IdString wire, IdString key, const std::string &value); + void setPipAttr(IdString pip, IdString key, const std::string &value); + void setBelAttr(IdString bel, IdString key, const std::string &value); + // --------------------------------------------------------------- // Common Arch API. Every arch must provide the following methods. @@ -151,6 +158,7 @@ struct Arch : BaseCtx 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; @@ -158,6 +166,7 @@ struct Arch : BaseCtx WireId getWireByName(IdString name) const; IdString 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); @@ -171,6 +180,7 @@ struct Arch : BaseCtx PipId getPipByName(IdString name) const; IdString 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); diff --git a/ice40/arch.h b/ice40/arch.h index 8fd1af23..b955a478 100644 --- a/ice40/arch.h +++ b/ice40/arch.h @@ -502,6 +502,12 @@ struct Arch : BaseCtx return IdString(chip_info->bel_data[bel.index].type); } + std::vector> getBelAttrs(BelId) const + { + std::vector> ret; + return ret; + } + WireId getBelPinWire(BelId bel, IdString pin) const; PortType getBelPinType(BelId bel, IdString pin) const; std::vector getBelPins(BelId bel) const; @@ -518,6 +524,12 @@ struct Arch : BaseCtx IdString getWireType(WireId wire) const; + std::vector> getWireAttrs(WireId) const + { + std::vector> ret; + return ret; + } + uint32_t getWireChecksum(WireId wire) const { return wire.index; } void bindWire(WireId wire, NetInfo *net, PlaceStrength strength) @@ -694,6 +706,12 @@ struct Arch : BaseCtx IdString getPipType(PipId pip) const { return IdString(); } + std::vector> getPipAttrs(PipId) const + { + std::vector> ret; + return ret; + } + uint32_t getPipChecksum(PipId pip) const { return pip.index; } WireId getPipSrcWire(PipId pip) const