Add getBelPinsForCellPin to Arch API
This is a basic implementation, without considering "M of N" arrangements (e.g. for LUT permuation where you only want to route to 1 out of 4/6 sinks) or using a type other than IdString to identify bel pins. But this is also enough to start working out where in nextpnr will break due to removing the 1:1 cell:bel pin cardinality, as a next step. Signed-off-by: gatecat <gatecat@ds0.me>
This commit is contained in:
parent
6bd3dba1e3
commit
85bb108ba4
@ -1093,6 +1093,7 @@ template <typename R> struct ArchAPI : BaseCtx
|
|||||||
virtual WireId getBelPinWire(BelId bel, IdString pin) const = 0;
|
virtual WireId getBelPinWire(BelId bel, IdString pin) const = 0;
|
||||||
virtual PortType getBelPinType(BelId bel, IdString pin) const = 0;
|
virtual PortType getBelPinType(BelId bel, IdString pin) const = 0;
|
||||||
virtual typename R::BelPinsRangeT getBelPins(BelId bel) const = 0;
|
virtual typename R::BelPinsRangeT getBelPins(BelId bel) const = 0;
|
||||||
|
virtual typename R::CellBelPinRangeT getBelPinsForCellPin(CellInfo *cell_info, IdString pin) const = 0;
|
||||||
// Wire methods
|
// Wire methods
|
||||||
virtual typename R::AllWiresRangeT getWires() const = 0;
|
virtual typename R::AllWiresRangeT getWires() const = 0;
|
||||||
virtual WireId getWireByName(IdStringList name) const = 0;
|
virtual WireId getWireByName(IdStringList name) const = 0;
|
||||||
@ -1176,6 +1177,8 @@ template <typename R> struct ArchAPI : BaseCtx
|
|||||||
// This contains the relevant range types for the default implementations of Arch functions
|
// This contains the relevant range types for the default implementations of Arch functions
|
||||||
struct BaseArchRanges
|
struct BaseArchRanges
|
||||||
{
|
{
|
||||||
|
// Bels
|
||||||
|
using CellBelPinRangeT = std::array<IdString, 1>;
|
||||||
// Attributes
|
// Attributes
|
||||||
using BelAttrsRangeT = std::vector<std::pair<IdString, std::string>>;
|
using BelAttrsRangeT = std::vector<std::pair<IdString, std::string>>;
|
||||||
using WireAttrsRangeT = std::vector<std::pair<IdString, std::string>>;
|
using WireAttrsRangeT = std::vector<std::pair<IdString, std::string>>;
|
||||||
@ -1241,6 +1244,11 @@ template <typename R> struct BaseArch : ArchAPI<R>
|
|||||||
return empty_if_possible<typename R::BelAttrsRangeT>();
|
return empty_if_possible<typename R::BelAttrsRangeT>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual typename R::CellBelPinRangeT getBelPinsForCellPin(CellInfo *cell_info, IdString pin) const override
|
||||||
|
{
|
||||||
|
return return_if_match<std::array<IdString, 1>, typename R::CellBelPinRangeT>({pin});
|
||||||
|
}
|
||||||
|
|
||||||
// Wire methods
|
// Wire methods
|
||||||
virtual IdString getWireType(WireId wire) const override { return IdString(); }
|
virtual IdString getWireType(WireId wire) const override { return IdString(); }
|
||||||
virtual typename R::WireAttrsRangeT getWireAttrs(WireId) const override
|
virtual typename R::WireAttrsRangeT getWireAttrs(WireId) const override
|
||||||
|
@ -13,6 +13,7 @@ The contents of `ArchRanges` is as follows:
|
|||||||
|`TileBelsRangeT` | `BelId` |
|
|`TileBelsRangeT` | `BelId` |
|
||||||
|`BelAttrsRangeT` | std::pair<IdString, std::string> |
|
|`BelAttrsRangeT` | std::pair<IdString, std::string> |
|
||||||
|`BelPinsRangeT` | `IdString` |
|
|`BelPinsRangeT` | `IdString` |
|
||||||
|
|`CellBelPinRangeT` | `IdString` |
|
||||||
|`AllWiresRangeT` | `WireId` |
|
|`AllWiresRangeT` | `WireId` |
|
||||||
|`DownhillPipRangeT` | `PipId` |
|
|`DownhillPipRangeT` | `PipId` |
|
||||||
|`UphillPipRangeT` | `PipId` |
|
|`UphillPipRangeT` | `PipId` |
|
||||||
@ -244,6 +245,12 @@ Return the type (input/output/inout) of the given bel pin.
|
|||||||
|
|
||||||
Return a list of all pins on that bel.
|
Return a list of all pins on that bel.
|
||||||
|
|
||||||
|
### CellBelPinRangeT getBelPinsForCellPin(CellInfo *cell_info, IdString pin) const
|
||||||
|
|
||||||
|
Return the list of bel pin names that a given cell pin should be routed to. In most cases there will be a single bel pin for each cell pin; and output pins must _always_ have only one bel pin associated with them.
|
||||||
|
|
||||||
|
*BaseArch default: returns a one-element array containing `pin`*
|
||||||
|
|
||||||
Wire Methods
|
Wire Methods
|
||||||
------------
|
------------
|
||||||
|
|
||||||
|
@ -660,6 +660,7 @@ struct ArchRanges
|
|||||||
using TileBelsRangeT = BelRange;
|
using TileBelsRangeT = BelRange;
|
||||||
using BelAttrsRangeT = std::vector<std::pair<IdString, std::string>>;
|
using BelAttrsRangeT = std::vector<std::pair<IdString, std::string>>;
|
||||||
using BelPinsRangeT = IdStringRange;
|
using BelPinsRangeT = IdStringRange;
|
||||||
|
using CellBelPinRangeT = std::array<IdString, 1>;
|
||||||
// Wires
|
// Wires
|
||||||
using AllWiresRangeT = WireRange;
|
using AllWiresRangeT = WireRange;
|
||||||
using DownhillPipRangeT = DownhillPipRange;
|
using DownhillPipRangeT = DownhillPipRange;
|
||||||
@ -866,6 +867,8 @@ struct Arch : ArchAPI<ArchRanges>
|
|||||||
return str_range;
|
return str_range;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::array<IdString, 1> getBelPinsForCellPin(CellInfo *cell_info, IdString pin) const override { return {pin}; }
|
||||||
|
|
||||||
// -------------------------------------------------
|
// -------------------------------------------------
|
||||||
|
|
||||||
WireId getWireByName(IdStringList name) const override;
|
WireId getWireByName(IdStringList name) const override;
|
||||||
|
@ -339,6 +339,8 @@ std::vector<IdString> Arch::getBelPins(BelId bel) const
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::array<IdString, 1> Arch::getBelPinsForCellPin(CellInfo *cell_info, IdString pin) const { return {pin}; }
|
||||||
|
|
||||||
// ---------------------------------------------------------------
|
// ---------------------------------------------------------------
|
||||||
|
|
||||||
WireId Arch::getWireByName(IdStringList name) const
|
WireId Arch::getWireByName(IdStringList name) const
|
||||||
|
@ -124,6 +124,7 @@ struct ArchRanges
|
|||||||
using TileBelsRangeT = const std::vector<BelId> &;
|
using TileBelsRangeT = const std::vector<BelId> &;
|
||||||
using BelAttrsRangeT = const std::map<IdString, std::string> &;
|
using BelAttrsRangeT = const std::map<IdString, std::string> &;
|
||||||
using BelPinsRangeT = std::vector<IdString>;
|
using BelPinsRangeT = std::vector<IdString>;
|
||||||
|
using CellBelPinRangeT = std::array<IdString, 1>;
|
||||||
// Wires
|
// Wires
|
||||||
using AllWiresRangeT = const std::vector<WireId> &;
|
using AllWiresRangeT = const std::vector<WireId> &;
|
||||||
using DownhillPipRangeT = const std::vector<PipId> &;
|
using DownhillPipRangeT = const std::vector<PipId> &;
|
||||||
@ -241,6 +242,7 @@ struct Arch : ArchAPI<ArchRanges>
|
|||||||
WireId getBelPinWire(BelId bel, IdString pin) const override;
|
WireId getBelPinWire(BelId bel, IdString pin) const override;
|
||||||
PortType getBelPinType(BelId bel, IdString pin) const override;
|
PortType getBelPinType(BelId bel, IdString pin) const override;
|
||||||
std::vector<IdString> getBelPins(BelId bel) const override;
|
std::vector<IdString> getBelPins(BelId bel) const override;
|
||||||
|
std::array<IdString, 1> getBelPinsForCellPin(CellInfo *cell_info, IdString pin) const override;
|
||||||
|
|
||||||
WireId getWireByName(IdStringList name) const override;
|
WireId getWireByName(IdStringList name) const override;
|
||||||
IdStringList getWireName(WireId wire) const override;
|
IdStringList getWireName(WireId wire) const override;
|
||||||
|
@ -822,6 +822,8 @@ std::vector<IdString> Arch::getBelPins(BelId bel) const
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::array<IdString, 1> Arch::getBelPinsForCellPin(CellInfo *cell_info, IdString pin) const { return {pin}; }
|
||||||
|
|
||||||
// ---------------------------------------------------------------
|
// ---------------------------------------------------------------
|
||||||
|
|
||||||
WireId Arch::getWireByName(IdStringList name) const
|
WireId Arch::getWireByName(IdStringList name) const
|
||||||
|
@ -251,6 +251,7 @@ struct ArchRanges
|
|||||||
using TileBelsRangeT = const std::vector<BelId> &;
|
using TileBelsRangeT = const std::vector<BelId> &;
|
||||||
using BelAttrsRangeT = const std::map<IdString, std::string> &;
|
using BelAttrsRangeT = const std::map<IdString, std::string> &;
|
||||||
using BelPinsRangeT = std::vector<IdString>;
|
using BelPinsRangeT = std::vector<IdString>;
|
||||||
|
using CellBelPinRangeT = std::array<IdString, 1>;
|
||||||
// Wires
|
// Wires
|
||||||
using AllWiresRangeT = const std::vector<WireId> &;
|
using AllWiresRangeT = const std::vector<WireId> &;
|
||||||
using DownhillPipRangeT = const std::vector<PipId> &;
|
using DownhillPipRangeT = const std::vector<PipId> &;
|
||||||
@ -375,6 +376,7 @@ struct Arch : BaseArch<ArchRanges>
|
|||||||
WireId getBelPinWire(BelId bel, IdString pin) const override;
|
WireId getBelPinWire(BelId bel, IdString pin) const override;
|
||||||
PortType getBelPinType(BelId bel, IdString pin) const override;
|
PortType getBelPinType(BelId bel, IdString pin) const override;
|
||||||
std::vector<IdString> getBelPins(BelId bel) const override;
|
std::vector<IdString> getBelPins(BelId bel) const override;
|
||||||
|
std::array<IdString, 1> getBelPinsForCellPin(CellInfo *cell_info, IdString pin) const override;
|
||||||
|
|
||||||
WireId getWireByName(IdStringList name) const override;
|
WireId getWireByName(IdStringList name) const override;
|
||||||
IdStringList getWireName(WireId wire) const override;
|
IdStringList getWireName(WireId wire) const override;
|
||||||
|
Loading…
Reference in New Issue
Block a user