[arch] Add Arch::isGlobalNet() API too
diff --git a/docs/archapi.md b/docs/archapi.md index 78b2053..6dcbac3 100644 --- a/docs/archapi.md +++ b/docs/archapi.md
@@ -433,7 +433,7 @@ ### bool route() -run the router. +Run the router. Graphics Methods ---------------- @@ -481,6 +481,13 @@ port. Where ports have more than one clock edge associated with them (such as DDR outputs), `index` can be used to obtain information for all edges. `index` must be in [0, clockInfoCount), behaviour is undefined otherwise. +Net Methods +------------------ + +### bool isGlobalNet(const NetInfo *net) const + +Returns true if the given net is driven by a global buffer. + Placer Methods -------------- @@ -492,5 +499,5 @@ ### bool isBelLocationValid(BelId bel) const -Returns true if a bell in the current configuration is valid, i.e. if +Returns true if a bel in the current configuration is valid, i.e. if `isValidBelForCell()` would return true for the current mapping.
diff --git a/ecp5/arch.cc b/ecp5/arch.cc index 380c0d7..f902e75 100644 --- a/ecp5/arch.cc +++ b/ecp5/arch.cc
@@ -768,6 +768,13 @@ return info; } +bool Arch::isGlobalNet(const NetInfo *net) const +{ + if (net == nullptr) + return false; + return net->driver.cell != nullptr && net->driver.port == id_CLKO; +} + std::vector<std::pair<std::string, std::string>> Arch::getTilesAtLocation(int row, int col) { std::vector<std::pair<std::string, std::string>> ret;
diff --git a/ecp5/arch.h b/ecp5/arch.h index 19fe1c4..8fba9c4 100644 --- a/ecp5/arch.h +++ b/ecp5/arch.h
@@ -955,7 +955,7 @@ TimingPortClass getPortTimingClass(const CellInfo *cell, IdString port, int &clockInfoCount) const; // Get the TimingClockingInfo of a port TimingClockingInfo getPortClockingInfo(const CellInfo *cell, IdString port, int index) const; - // Return true if a port is a net + // Return true if net is driven from global buffer bool isGlobalNet(const NetInfo *net) const; bool getDelayFromTimingDatabase(IdString tctype, IdString from, IdString to, DelayInfo &delay) const;
diff --git a/generic/arch.cc b/generic/arch.cc index 7065cc3..3317295 100644 --- a/generic/arch.cc +++ b/generic/arch.cc
@@ -474,6 +474,11 @@ NPNR_ASSERT_FALSE("no clocking info for generic"); } +bool Arch::isGlobalNet(const NetInfo *net) const +{ + return false; +} + bool Arch::isValidBelForCell(CellInfo *cell, BelId bel) const { return true; } bool Arch::isBelLocationValid(BelId bel) const { return true; }
diff --git a/generic/arch.h b/generic/arch.h index de1fca2..d3c1d96 100644 --- a/generic/arch.h +++ b/generic/arch.h
@@ -238,6 +238,8 @@ TimingPortClass getPortTimingClass(const CellInfo *cell, IdString port, int &clockInfoCount) const; // Get the TimingClockingInfo of a port TimingClockingInfo getPortClockingInfo(const CellInfo *cell, IdString port, int index) const; + // Return true if net is driven from global buffer + bool isGlobalNet(const NetInfo *net) const; bool isValidBelForCell(CellInfo *cell, BelId bel) const; bool isBelLocationValid(BelId bel) const;
diff --git a/ice40/arch.h b/ice40/arch.h index a74528a..51a8ec0 100644 --- a/ice40/arch.h +++ b/ice40/arch.h
@@ -851,7 +851,7 @@ TimingPortClass getPortTimingClass(const CellInfo *cell, IdString port, int &clockInfoCount) const; // Get the TimingClockingInfo of a port TimingClockingInfo getPortClockingInfo(const CellInfo *cell, IdString port, int index) const; - // Return true if a port is a net + // Return true if net is driven from global buffer bool isGlobalNet(const NetInfo *net) const; // -------------------------------------------------