11#ifndef AIE_PATHFINDER_H
12#define AIE_PATHFINDER_H
24#define OVER_CAPACITY_COEFF 0.1
25#define USED_CAPACITY_COEFF 0.02
26#define DEMAND_COEFF 1.1
27#define DEMAND_BASE 1.0
28#define MAX_CIRCUIT_STREAM_CAPACITY 1
29#define MAX_PACKET_STREAM_CAPACITY 32
45 std::vector<std::vector<double>>
demand;
66 std::vector<int>(
dstPorts.size(), 0));
69 std::vector<bool>(
dstPorts.size(),
false));
74 for (
size_t i = 0; i <
srcPorts.size(); i++) {
75 for (
size_t j = 0; j <
dstPorts.size(); j++) {
79 demand[i][j] = history * congestion;
103 os <<
"PathEndPoint(" << s.coords <<
": " << s.port <<
")";
117 return std::tie(
coords,
port) < std::tie(rhs.coords, rhs.port);
121 return std::tie(
coords,
port) == std::tie(rhs.coords, rhs.port);
129 std::vector<PathEndPoint>
dsts;
142 std::vector<Port>
dsts;
149 << join(llvm::map_range(setting.srcs,
151 std::ostringstream ss;
158 << join(llvm::map_range(setting.dsts,
160 std::ostringstream ss;
191 Port dstPort,
bool isPacketFlow,
193 virtual void sortFlows(
const int maxCol,
const int maxRow) = 0;
195 virtual std::optional<std::map<PathEndPoint, SwitchSettings>>
206 void sortFlows(
const int maxCol,
const int maxRow)
override;
208 std::optional<std::map<PathEndPoint, SwitchSettings>>
214 std::vector<Flow> flows;
225 std::map<PathEndPoint, std::vector<PathEndPoint>> channels;
271 s <<
"\tSwitchSettings: ";
272 for (
const auto &[coords, setting] : ss) {
273 s << coords <<
": " << setting <<
" | ";
#define GENERATE_TO_STRING(TYPE_WITH_INSERTION_OP)
#define MAX_CIRCUIT_STREAM_CAPACITY
#define OVER_CAPACITY_COEFF
#define USED_CAPACITY_COEFF
ShimMuxOp getShimMux(mlir::OpBuilder &builder, int col)
SwitchboxOp getSwitchbox(mlir::OpBuilder &builder, int col, int row)
llvm::DenseMap< TileID, SwitchboxOp > coordToSwitchbox
TileOp getTile(mlir::OpBuilder &builder, int col, int row)
DynamicTileAnalysis(std::shared_ptr< Router > p)
llvm::DenseMap< TileID, ShimMuxOp > coordToShimMux
std::shared_ptr< Router > pathfinder
std::map< PathEndPoint, bool > processedFlows
mlir::LogicalResult runAnalysis(DeviceOp &device)
llvm::DenseMap< TileID, TileOp > coordToTile
std::map< PathEndPoint, SwitchSettings > flowSolutions
llvm::DenseMap< int, PLIOOp > coordToPLIO
std::map< PathEndPoint, PathEndPoint > dijkstraShortestPaths(PathEndPoint src)
bool addFixedConnection(SwitchboxOp switchboxOp) override
void initialize(int maxCol, int maxRow, const AIETargetModel &targetModel) override
std::optional< std::map< PathEndPoint, SwitchSettings > > findPaths(int maxIterations) override
void sortFlows(const int maxCol, const int maxRow) override
void addFlow(TileID srcCoords, Port srcPort, TileID dstCoords, Port dstPort, bool isPacketFlow, bool isPriorityFlow) override
virtual bool addFixedConnection(SwitchboxOp switchboxOp)=0
virtual void sortFlows(const int maxCol, const int maxRow)=0
virtual std::optional< std::map< PathEndPoint, SwitchSettings > > findPaths(int maxIterations)=0
virtual void initialize(int maxCol, int maxRow, const AIETargetModel &targetModel)=0
virtual ~Router()=default
virtual void addFlow(TileID srcCoords, Port srcPort, TileID dstCoords, Port dstPort, bool isPacketFlow, bool isPriorityFlow)=0
raw_ostream & operator<<(raw_ostream &os, const xilinx::AIE::SwitchSettings &ss)
Include the generated interface declarations.
std::vector< std::vector< int > > packetFlowCount
std::vector< std::vector< int > > overCapacity
SwitchSetting { SwitchSetting()=default SwitchSetting
int getWireBundleAsInt(WireBundle bundle)
friend std::ostream & operator<<(std::ostream &os, const Port &port)
SwitchboxConnect { SwitchboxConnect()=default SwitchboxConnect
std::vector< PathEndPoint > dsts
void bumpDemand(size_t i, size_t j)
TileID { friend std::ostream &operator<<(std::ostream &os, const TileID &s) { os<< "TileID("<< s.col<< ", "<< s.row<< ")" TileID
friend std::string to_string(const TileID &s)
std::vector< std::vector< int > > packetGroupId
std::map< TileID, SwitchSetting > SwitchSettings
Port { WireBundle bundle Port
std::vector< std::vector< double > > demand
std::vector< Port > dstPorts
std::vector< std::vector< bool > > isPriority
bool operator==(const Port &rhs) const
std::vector< std::vector< Connectivity > > connectivity
std::vector< Port > srcPorts
Flow { int packetGroupId Flow
PathEndPoint { PathEndPoint()=default PathEndPoint
std::vector< std::vector< int > > usedCapacity
bool operator<(const Port &rhs) const