diff --git a/cyclonev/arch.cc b/cyclonev/arch.cc index e0721791..41c39876 100644 --- a/cyclonev/arch.cc +++ b/cyclonev/arch.cc @@ -1,7 +1,7 @@ /* * nextpnr -- Next Generation Place and Route * - * Copyright (C) 2020 Lofty * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -14,5 +14,82 @@ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * */ + +#include + +#include "nextpnr.h" + +#include "mistral/lib/cyclonev.h" + +NEXTPNR_NAMESPACE_BEGIN + +using mistral::CycloneV; + +Arch::Arch(ArchArgs args) +{ + this->args = args; + this->cyclonev = mistral::CycloneV::get_model(args.device); + NPNR_ASSERT(this->cyclonev != nullptr); +} + +int Arch::getTileBelDimZ(int x, int y) const +{ + CycloneV::pos_t pos = cyclonev->xy2pos(x, y); + + for (CycloneV::block_type_t bel : cyclonev->pos_get_bels(pos)) { + switch (bel) { + case CycloneV::block_type_t::LAB: + /* + * nextpnr and mistral disagree on what a BEL is: mistral thinks an entire LAB + * is one BEL, but nextpnr wants something with more precision. + * + * One LAB contains 10 ALMs. + * One ALM contains 2 LUT outputs and 4 flop outputs. + */ + return 60; + case CycloneV::block_type_t::GPIO: + // GPIO tiles contain 4 pins. + return 4; + default: + continue; + } + } + + // As a temporary hack, only LABs and IO are allowed to be placed, so every other tile type has zero BELs. + return 0; +} + +BelId Arch::getBelByName(IdString name) const +{ + char bel_type_str[80] = {0}; + int x = 0, y = 0, z = 0; + BelId bel; + + sscanf(name.c_str(this), "%s.%d.%d.%d", bel_type_str, &x, &y, &z); + + auto bel_type = cyclonev->block_type_lookup(std::string{bel_type_str}); + + bel.pos = CycloneV::xy2pos(x, y); + bel.z = (bel_type << 8) | z; + + return bel; +} + +IdString Arch::getBelName(BelId bel) const +{ + char bel_str[80] = {0}; + + int x = CycloneV::pos2x(bel.pos); + int y = CycloneV::pos2y(bel.pos); + int z = bel.pos & 0xFF; + int bel_type = bel.z >> 8; + + snprintf(bel_str, 80, "%s.%03d.%03d.%03d", cyclonev->block_type_names[bel_type], x, y, z); + + return id(bel_str); +} + + + +NEXTPNR_NAMESPACE_END \ No newline at end of file diff --git a/cyclonev/arch.h b/cyclonev/arch.h index 03b7d54e..5ad13b51 100644 --- a/cyclonev/arch.h +++ b/cyclonev/arch.h @@ -1,7 +1,7 @@ /* * nextpnr -- Next Generation Place and Route * - * Copyright (C) 2020 Lofty + * Copyright (C) 2021 Lofty * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -21,265 +21,95 @@ #error Include "arch.h" via "nextpnr.h" only. #endif +#include "mistral/lib/cyclonev.h" + NEXTPNR_NAMESPACE_BEGIN -struct BelIterator -{ - int cursor; - - BelIterator operator++() - { - cursor++; - return *this; - } - BelIterator operator++(int) - { - BelIterator prior(*this); - cursor++; - return prior; - } - - bool operator!=(const BelIterator &other) const { return cursor != other.cursor; } - - bool operator==(const BelIterator &other) const { return cursor == other.cursor; } - - BelId operator*() const - { - BelId ret; - ret.index = cursor; - return ret; - } -}; - -struct BelRange -{ - BelIterator b, e; - BelIterator begin() const { return b; } - BelIterator end() const { return e; } -}; - -// ----------------------------------------------------------------------- - -struct BelPinIterator -{ - const /* something */ int *ptr = nullptr; - - void operator++() { ptr++; } - bool operator!=(const BelPinIterator &other) const { return ptr != other.ptr; } - - BelPin operator*() const - { - BelPin ret; - return ret; - } -}; - -struct BelPinRange -{ - BelPinIterator b, e; - BelPinIterator begin() const { return b; } - BelPinIterator end() const { return e; } -}; - -// ----------------------------------------------------------------------- - -struct WireIterator -{ - int cursor = -1; - - void operator++() { cursor++; } - bool operator!=(const WireIterator &other) const { return cursor != other.cursor; } - - WireId operator*() const - { - WireId ret; - ret.index = cursor; - return ret; - } -}; - -struct WireRange -{ - WireIterator b, e; - WireIterator begin() const { return b; } - WireIterator end() const { return e; } -}; - -// ----------------------------------------------------------------------- - -struct AllPipIterator -{ - int cursor = -1; - - void operator++() { cursor++; } - bool operator!=(const AllPipIterator &other) const { return cursor != other.cursor; } - - PipId operator*() const - { - PipId ret; - ret.index = cursor; - return ret; - } -}; - -struct AllPipRange -{ - AllPipIterator b, e; - AllPipIterator begin() const { return b; } - AllPipIterator end() const { return e; } -}; - -// ----------------------------------------------------------------------- - -struct PipIterator -{ - const int *cursor = nullptr; - - void operator++() { cursor++; } - bool operator!=(const PipIterator &other) const { return cursor != other.cursor; } - - PipId operator*() const - { - PipId ret; - ret.index = *cursor; - return ret; - } -}; - -struct PipRange -{ - PipIterator b, e; - PipIterator begin() const { return b; } - PipIterator end() const { return e; } -}; - struct ArchArgs { + std::string device; }; struct Arch : BaseCtx { ArchArgs args; + mistral::CycloneV* cyclonev; + Arch(ArchArgs args); - std::string getChipName() const; + std::string getChipName() const { return std::string{"TODO: getChipName"}; } IdString archId() const { return id("cyclonev"); } - ArchArgs archArgs() const; - IdString archArgsToId(ArchArgs args) const; + ArchArgs archArgs() const { return args; } + IdString archArgsToId(ArchArgs args) const { return id("TODO: archArgsToId"); } // ------------------------------------------------- - int getGridDimX() const; - int getGridDimY() const; - int getTileBelDimZ(int, int) const; - int getTilePipDimZ(int, int) const; + int getGridDimX() const { return cyclonev->get_tile_sx(); } + int getGridDimY() const { return cyclonev->get_tile_sy(); } + int getTileBelDimZ(int x, int y) const; // arch.cc + int getTilePipDimZ(int x, int y) const { return 1; } // ------------------------------------------------- - BelId getBelByName(IdString name) const; - - IdString getBelName(BelId bel) const; - - uint32_t getBelChecksum(BelId bel) const; - + BelId getBelByName(IdString name) const; // arch.cc + IdString getBelName(BelId bel) const; // arch.cc + uint32_t getBelChecksum(BelId bel) const { return (bel.pos << 16) | bel.z; } 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; - - BelRange getBels() const; - + const std::vector &getBels() const; Loc getBelLocation(BelId bel) const; - BelId getBelByLocation(Loc loc) const; - BelRange getBelsByTile(int x, int y) const; - + const std::vector &getBelsByTile(int x, int y) const; bool getBelGlobalBuf(BelId bel) const; - IdString getBelType(BelId bel) const; - std::vector> getBelAttrs(BelId bel) const; - WireId getBelPinWire(BelId bel, IdString pin) const; PortType getBelPinType(BelId bel, IdString pin) const; std::vector getBelPins(BelId bel) const; - bool isBelLocked(BelId bel) const; // ------------------------------------------------- WireId getWireByName(IdString name) const; - IdString getWireName(WireId wire) const; - IdString getWireType(WireId wire) const; std::vector> 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; - NetInfo *getConflictingWireNet(WireId wire) const; - DelayInfo getWireDelay(WireId wire) const; - - BelPinRange getWireBelPins(WireId wire) const; - - WireRange getWires() const; + const std::vector &getWireBelPins(WireId wire) const; + const std::vector &getWires() const; // ------------------------------------------------- PipId getPipByName(IdString name) 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; - - AllPipRange getPips() const; - + const std::vector &getPips() const; Loc getPipLocation(PipId pip) const; - IdString getPipName(PipId pip) const; - IdString getPipType(PipId pip) const; std::vector> getPipAttrs(PipId pip) const; - uint32_t getPipChecksum(PipId pip) const; - WireId getPipSrcWire(PipId pip) const; - WireId getPipDstWire(PipId pip) const; - DelayInfo getPipDelay(PipId pip) const; - - PipRange getPipsDownhill(WireId wire) const; - - PipRange getPipsUphill(WireId wire) const; - - PipRange getWireAliases(WireId wire) const; - + const std::vector &getPipsDownhill(WireId wire) const; + const std::vector &getPipsUphill(WireId wire) const; + const std::vector &getWireAliases(WireId wire) const; BelId getPackagePinBel(const std::string &pin) const; std::string getBelPackagePin(BelId bel) const; diff --git a/cyclonev/archdefs.h b/cyclonev/archdefs.h index 9b72d268..a108bd6a 100644 --- a/cyclonev/archdefs.h +++ b/cyclonev/archdefs.h @@ -1,7 +1,7 @@ /* * nextpnr -- Next Generation Place and Route * - * Copyright (C) 2020 Lofty + * Copyright (C) 2021 Lofty