33 const std::vector<XAie_LocType> &vInLocs,
40 State.Initialized = 1;
44 const std::vector<XAie_LocType> &vInLocs,
56 if (
State.Reserved == 1) {
72 AieRC RC = XAIE_INVALID_ARGS;
74 if (
State.Reserved == 0) {
76 static_cast<uint32_t
>(Loc.Col) <<
"," <<
static_cast<uint32_t
>(Loc.Row) <<
")" <<
78 " resource not reserved." << std::endl;
81 uint8_t TileType = XAie_GetTileTypefromLoc(
AieHd->dev(), Loc);
82 for (
int i = 0; i < (int)vLocs.size(); i++) {
83 if (Loc.Col == vLocs[i].Col && Loc.Row == vLocs[i].Row) {
85 if (TileType == XAIEGBL_TILE_TYPE_AIETILE) {
86 if (Mod == XAIE_MEM_MOD) {
87 Event = XAIE_EVENT_BROADCAST_0_MEM;
89 Event = XAIE_EVENT_BROADCAST_0_CORE;
91 }
else if (TileType == XAIEGBL_TILE_TYPE_MEMTILE) {
92 Event = XAIE_EVENT_BROADCAST_0_MEM_TILE;
94 Event = XAIE_EVENT_BROADCAST_A_0_PL;
96 Event =
static_cast<XAie_Events
>(
static_cast<uint32_t
>(Event) +
126 return AieHd->getRscGroup(GName).getRscStat(vLocs,
129 return AieHd->getRscGroup(GName).getRscStat(vLocs,
137 if (vLocs.size() != 0) {
138 RC = setRscs(
AieHd, vLocs, StartMod, EndMod,
vRscs);
142 RC =
AieHd->rscMgr()->request(*
this);
147 __func__ <<
" resource not available.\n";
158 RC =
AieHd->rscMgr()->release(*
this);
167 for(
auto r =
vRscs.begin(); r !=
vRscs.end();) {
168 uint8_t un_block = 0;
169 uint8_t un_block_n = 0;
171 TType = XAie_GetTileTypefromLoc(
dev(), (*r).Loc);
172 if (TType == XAIEGBL_TILE_TYPE_AIETILE) {
173 if (r !=
vRscs.begin()) {
174 if ((*(r - 1)).Loc.Col < ((*r).Loc.Col )) {
175 un_block |= XAIE_EVENT_BROADCAST_WEST;
176 }
else if ((*(r - 1)).Loc.Col > ((*r).Loc.Col)) {
177 un_block |= XAIE_EVENT_BROADCAST_EAST;
178 }
else if ((*(r - 1)).Loc.Row > ((*r).Loc.Row)) {
179 un_block |= XAIE_EVENT_BROADCAST_NORTH;
181 un_block |= XAIE_EVENT_BROADCAST_SOUTH;
185 if ((r + 2) !=
vRscs.end()) {
186 if ((*(r + 2)).Loc.Col < ((*r).Loc.Col )) {
187 un_block |= XAIE_EVENT_BROADCAST_WEST;
188 }
else if ((*(r + 2)).Loc.Col > ((*r).Loc.Col)) {
189 un_block |= XAIE_EVENT_BROADCAST_EAST;
190 }
else if ((*(r + 2)).Loc.Row > ((*r).Loc.Row)) {
191 un_block |= XAIE_EVENT_BROADCAST_NORTH;
193 un_block |= XAIE_EVENT_BROADCAST_SOUTH;
196 un_block_n = un_block;
198 XAie_IsDeviceCheckerboard(
dev(), &IsCheckerBoard);
199 if (IsCheckerBoard) {
201 if ((*r).Loc.Row % 2) {
202 un_block |= XAIE_EVENT_BROADCAST_EAST;
203 un_block_n |= XAIE_EVENT_BROADCAST_WEST;
205 un_block |= XAIE_EVENT_BROADCAST_WEST;
206 un_block_n |= XAIE_EVENT_BROADCAST_EAST;
210 un_block |= XAIE_EVENT_BROADCAST_EAST;
211 un_block_n |= XAIE_EVENT_BROADCAST_WEST;
214 RC = XAie_EventBroadcastUnblockDir(
dev(),
218 XAIE_EVENT_BROADCAST_ALL);
219 RC = XAie_EventBroadcastUnblockDir(
dev(),
220 (*(r+1)).Loc, (*(r + 1)).Mod,
223 XAIE_EVENT_BROADCAST_ALL);
224 RC = XAie_EventBroadcastBlockDir(
dev(),
228 XAIE_EVENT_BROADCAST_ALL & (~un_block));
229 RC = XAie_EventBroadcastBlockDir(
dev(),
230 (*(r + 1)).Loc, (*(r+1)).Mod,
233 XAIE_EVENT_BROADCAST_ALL & (~un_block_n));
237 if (r !=
vRscs.begin()) {
238 if ((*(r - 1)).Loc.Col < ((*r).Loc.Col )) {
239 un_block = XAIE_EVENT_BROADCAST_WEST;
240 }
else if ((*(r - 1)).Loc.Col > ((*r).Loc.Col)) {
241 un_block = XAIE_EVENT_BROADCAST_EAST;
243 un_block = XAIE_EVENT_BROADCAST_NORTH;
246 if ((r + 1) !=
vRscs.end()) {
247 if ((*(r + 1)).Loc.Col < ((*r).Loc.Col )) {
248 un_block |= XAIE_EVENT_BROADCAST_WEST;
249 }
else if ((*(r + 1)).Loc.Col > ((*r).Loc.Col)) {
250 un_block |= XAIE_EVENT_BROADCAST_EAST;
252 un_block |= XAIE_EVENT_BROADCAST_NORTH;
255 RC = XAie_EventBroadcastUnblockDir(
dev(),
259 XAIE_EVENT_BROADCAST_ALL);
260 RC = XAie_EventBroadcastUnblockDir(
dev(),
264 XAIE_EVENT_BROADCAST_ALL);
265 RC = XAie_EventBroadcastBlockDir(
dev(),
269 XAIE_EVENT_BROADCAST_ALL & (~(un_block | XAIE_EVENT_BROADCAST_EAST)));
271 RC = XAie_EventBroadcastBlockDir(
dev(),
275 XAIE_EVENT_BROADCAST_ALL & (~(un_block | XAIE_EVENT_BROADCAST_WEST)));
286 " failed to stop." << std::endl;
295 if(vLocs.size() == 0) {
299 for (
auto r:
vRscs) {
300 if (r.Loc.Row == 0) {
302 iRC |= XAie_EventBroadcastUnblockDir(
dev(),
304 XAIE_EVENT_SWITCH_A, r.RscId,
305 XAIE_EVENT_BROADCAST_ALL);
306 iRC |= XAie_EventBroadcastUnblockDir(
dev(),
308 XAIE_EVENT_SWITCH_B, r.RscId,
309 XAIE_EVENT_BROADCAST_ALL);
311 iRC |= XAie_EventBroadcastUnblockDir(
dev(),
313 XAIE_EVENT_SWITCH_A, r.RscId,
314 XAIE_EVENT_BROADCAST_ALL);
317 if (iRC != (
int)XAIE_OK) {
319 " failed to stop." << std::endl;
327 void _getReservedRscs(std::vector<XAieUserRsc> &vOutRscs)
const {
328 vOutRscs.insert(vOutRscs.end(),
vRscs.begin(),
vRscs.end());
331 XAie_ModuleType StartMod;
332 XAie_ModuleType EndMod;
333 std::vector<XAie_LocType> vLocs;
335 static AieRC setRscs(std::shared_ptr<XAieDevHandle> Dev,
336 const std::vector<XAie_LocType> &vL,
337 XAie_ModuleType startM, XAie_ModuleType endM,
338 std::vector<XAieUserRsc> &vR) {
340 if ((vL[0].Row == 0 && startM != XAIE_PL_MOD) ||
341 (vL.back().Row == 0 && endM != XAIE_PL_MOD) ||
342 (vL[0].Row != 0 && startM == XAIE_PL_MOD) ||
343 (vL.back().Row != 0 && endM == XAIE_PL_MOD)) {
345 "BC: invalid tiles and modules combination." << std::endl;
346 return XAIE_INVALID_ARGS;
349 for (
size_t i = 0; i < vL.size(); i++) {
355 TType = XAie_GetTileTypefromLoc(Dev->dev(),
357 if (TType == XAIEGBL_TILE_TYPE_MAX) {
359 "BC: invalid tile (" << vL[i].Col <<
360 "," << vL[i].Row <<
")" <<
362 return XAIE_INVALID_ARGS;
365 R.Loc.Col = vL[i].Col;
366 R.Loc.Row = vL[i].Row;
368 if (TType == XAIEGBL_TILE_TYPE_AIETILE) {
369 R.Mod = XAIE_CORE_MOD;
371 R.Mod = XAIE_MEM_MOD;
373 }
else if (TType == XAIEGBL_TILE_TYPE_MEMTILE) {
374 R.Mod = XAIE_MEM_MOD;
381 if (i != vL.size() - 1) {
382 if (vL[i+1].Row == vL[i].Row &&
383 vL[i+1].Col == vL[i].Col) {
385 "BC: duplicated tiles in the vector." <<
387 return XAIE_INVALID_ARGS;
389 if (vL[i+1].Row != vL[i].Row) {
390 if ((vL[i+1].Col != vL[i].Col) ||
391 (vL[i+1].Row > vL[i].Row &&
392 (vL[i+1].Row - vL[i].Row) > 1) ||
393 (vL[i+1].Row < vL[i].Row &&
394 (vL[i].Row - vL[i+1].Row) > 1)) {
396 "BC: discontinuous input tiles." <<
398 return XAIE_INVALID_ARGS;
401 if ((vL[i+1].Col > vL[i].Col &&
402 (vL[i+1].Col - vL[i].Col) > 1) ||
403 (vL[i+1].Col < vL[i].Col &&
404 (vL[i].Col - vL[i+1].Col) > 1)) {
406 "BC: discontinuous input tiles." <<
408 return XAIE_INVALID_ARGS;