From 22558704460b19425d28cc91b2565c7964ed7a19 Mon Sep 17 00:00:00 2001 From: Clifford Wolf Date: Wed, 23 May 2018 17:58:57 +0200 Subject: Create compile-able demo that doesn't do anything Signed-off-by: Clifford Wolf --- database.h | 171 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 171 insertions(+) create mode 100644 database.h (limited to 'database.h') diff --git a/database.h b/database.h new file mode 100644 index 00000000..81205f20 --- /dev/null +++ b/database.h @@ -0,0 +1,171 @@ +#include +#include +#include +#include +#include + +// replace with proper IdString later +typedef std::string IdString; + +// replace with haslib later +template using pool = std::unordered_set; +template using dict = std::unordered_map; +using std::vector; + +// ------------------------------------------------------- +// Arch-specific declarations + +struct ObjId +{ + uint8_t tile_x = 0, tile_y = 0; + uint16_t index = 0; + + bool nil() const { + return !tile_x && !tile_y && !index; + } +} __attribute__((packed)); + +namespace std +{ + template<> struct hash + { + std::size_t operator()(const ObjId &obj) const noexcept + { + std::size_t result = std::hash{}(obj.index); + result ^= std::hash{}(obj.tile_x) + 0x9e3779b9 + (result << 6) + (result >> 2); + result ^= std::hash{}(obj.tile_y) + 0x9e3779b9 + (result << 6) + (result >> 2); + return result; + } + }; +} + +struct ObjIterator +{ + ObjId *ptr = nullptr; + + void operator++() { ptr++; } + bool operator!=(const ObjIterator &other) const { return ptr != other.ptr; } + ObjId operator*() const { return *ptr; } +}; + +struct ObjRange +{ + ObjIterator b, e; + ObjIterator begin() const { return b; } + ObjIterator end() const { return e; } +}; + +struct BelPin +{ + ObjId bel; + IdString pin; +}; + +struct BelPinIterator +{ + BelPin *ptr = nullptr; + + void operator++() { ptr++; } + bool operator!=(const BelPinIterator &other) const { return ptr != other.ptr; } + BelPin operator*() const { return *ptr; } +}; + +struct BelPinRange +{ + BelPinIterator b, e; + BelPinIterator begin() const { return b; } + BelPinIterator end() const { return e; } +}; + +struct GuiLine +{ + float x1, y1, x2, y2; +}; + +struct Chip +{ + // ... + + Chip(std::string cfg); + + void setBelActive(ObjId bel, bool active); + bool getBelActive(ObjId bel); + + ObjId getObjByName(IdString name) const; + IdString getObjName(ObjId obj) const; + + ObjRange getBels() const; + ObjRange getBelsByType(IdString type) const; + IdString getBelType(ObjId bel) const; + + void getObjPosition(ObjId obj, float &x, float &y) const; + vector getGuiLines(ObjId obj) const; + + ObjRange getWires() const; + ObjRange getWiresUphill(ObjId wire) const; + ObjRange getWiresDownhill(ObjId wire) const; + ObjRange getWiresBidir(ObjId wire) const; + ObjRange getWireAliases(ObjId wire) const; + + // the following will only operate on / return "active" BELs + // multiple active uphill BELs for a wire will cause a runtime error + ObjId getWireBelPin(ObjId bel, IdString pin) const; + BelPin getBelPinUphill(ObjId wire) const; + BelPinRange getBelPinsDownhill(ObjId wire) const; +}; + +// ------------------------------------------------------- +// Generic declarations + +struct PortRef +{ + IdString cell_name; + IdString port_name; +}; + +struct NetInfo +{ + IdString name; + PortRef driver; + vector users; + dict attrs; + + // wire -> delay + dict wires; +}; + +enum PortType +{ + PORT_IN = 0, + PORT_OUT = 1, + PORT_INOUT = 2 +}; + +struct PortInfo +{ + IdString name, net; + PortType type; +}; + +struct CellInfo +{ + IdString name, type; + dict ports; + dict attrs, params; + + ObjId bel; + // cell_port -> bel_pin + dict pins; +}; + +struct Design +{ + struct Chip chip; + + Design(std::string chipCfg) : chip(chipCfg) { + // ... + } + + dict nets; + dict cells; +}; -- cgit v1.2.3