| #ifndef LIBTRELLIS_CHIP_HPP | |
| #define LIBTRELLIS_CHIP_HPP | |
| #include <string> | |
| #include <memory> | |
| #include <vector> | |
| #include <cstdint> | |
| #include <map> | |
| #include <set> | |
| #include "CRAM.hpp" | |
| using namespace std; | |
| namespace Trellis { | |
| // Basic information about a chip that may be needed elsewhere | |
| struct ChipInfo | |
| { | |
| string name; | |
| string family; | |
| uint32_t idcode; | |
| int num_frames; | |
| int bits_per_frame; | |
| int pad_bits_before_frame; | |
| int pad_bits_after_frame; | |
| // 0-based. | |
| int max_row; | |
| int max_col; | |
| // Trellis uses 0-based indexing, but some devices don't. | |
| int col_bias; | |
| }; | |
| // Information about the global networks in a chip | |
| struct GlobalRegion | |
| { | |
| string name; | |
| int x0, y0, x1, y1; | |
| bool matches(int row, int col) const; | |
| }; | |
| inline bool operator==(const GlobalRegion &a, const GlobalRegion &b) | |
| { | |
| return (a.name == b.name) && (a.x0 == b.x0) && (a.x1 == b.x1) && (a.y0 == b.y0) && (a.y1 == b.y1); | |
| } | |
| struct TapSegment | |
| { | |
| int tap_col; | |
| int lx0, lx1, rx0, rx1; | |
| bool matches_left(int row, int col) const; | |
| bool matches_right(int row, int col) const; | |
| }; | |
| inline bool operator==(const TapSegment &a, const TapSegment &b) | |
| { | |
| return (a.tap_col == b.tap_col) && (a.lx0 == b.lx0) && (a.lx1 == b.lx1) && (a.rx0 == b.rx0) && (a.rx1 == b.rx1); | |
| } | |
| struct TapDriver | |
| { | |
| int col; | |
| enum TapDir | |
| { | |
| LEFT, | |
| RIGHT | |
| } dir; | |
| }; | |
| struct SpineSegment | |
| { | |
| int tap_col; | |
| string quadrant; | |
| int spine_row, spine_col; | |
| }; | |
| struct GlobalsInfo | |
| { | |
| vector<GlobalRegion> quadrants; | |
| vector<TapSegment> tapsegs; | |
| vector<SpineSegment> spinesegs; | |
| string get_quadrant(int row, int col) const; | |
| TapDriver get_tap_driver(int row, int col) const; | |
| pair<int, int> get_spine_driver(std::string quadrant, int col); | |
| }; | |
| class Tile; | |
| // A difference between two Chips | |
| // A list of pairs mapping between tile identifier (name:type) and tile difference | |
| typedef map<string, CRAMDelta> ChipDelta; | |
| class RoutingGraph; | |
| class Chip | |
| { | |
| public: | |
| // Construct a chip by looking up part name | |
| explicit Chip(string name); | |
| // Construct a chip by looking up device ID | |
| explicit Chip(uint32_t idcode); | |
| // Construct a chip from a ChipInfo | |
| explicit Chip(const ChipInfo &info); | |
| // Basic information about a chip | |
| ChipInfo info; | |
| // The chip's configuration memory | |
| CRAM cram; | |
| // Tile access | |
| shared_ptr<Tile> get_tile_by_name(string name); | |
| vector<shared_ptr<Tile>> get_tiles_by_position(int row, int col); | |
| vector<shared_ptr<Tile>> get_tiles_by_type(string type); | |
| vector<shared_ptr<Tile>> get_all_tiles(); | |
| string get_tile_by_position_and_type(int row, int col, string type); | |
| string get_tile_by_position_and_type(int row, int col, set<string> type); | |
| // Map tile name to a tile reference | |
| map<string, shared_ptr<Tile>> tiles; | |
| // Miscellaneous information | |
| uint32_t usercode = 0x0; | |
| uint32_t ctrl0 = 0x40000000; | |
| vector<string> metadata; | |
| // Get max row and column | |
| int get_max_row() const; | |
| int get_max_col() const; | |
| // Build the routing graph for the chip | |
| shared_ptr<RoutingGraph> get_routing_graph(); | |
| vector<vector<vector<pair<string, string>>>> tiles_at_location; | |
| // Block RAM initialisation (WIP) | |
| map<uint16_t, vector<uint16_t>> bram_data; | |
| // Globals data | |
| GlobalsInfo global_data; | |
| }; | |
| ChipDelta operator-(const Chip &a, const Chip &b); | |
| } | |
| #endif //LIBTRELLIS_CHIP_HPP |