17#include "mlir/IR/Attributes.h"
18#include "mlir/Pass/Pass.h"
21#define GEN_PASS_DEF_AIEXINLINETRACECONFIG
22#include "aie/Dialect/AIEX/Transforms/AIEXPasses.h.inc"
32struct AIEInlineTraceConfigPass
33 : xilinx::AIEX::impl::AIEXInlineTraceConfigBase<AIEInlineTraceConfigPass> {
34 void runOnOperation()
override {
35 AIE::DeviceOp device = getOperation();
36 const auto &targetModel = device.getTargetModel();
39 SmallVector<TraceStartConfigOp> startConfigs;
40 device.walk([&](TraceStartConfigOp startConfig) {
41 startConfigs.push_back(startConfig);
44 for (
auto startConfig : startConfigs) {
45 OpBuilder builder(startConfig);
48 auto configSymbolName = startConfig.getTraceConfig();
50 dyn_cast_or_null<TraceConfigOp>(SymbolTable::lookupNearestSymbolFrom(
51 device, builder.getStringAttr(configSymbolName)));
54 startConfig.emitError(
"trace config symbol '")
55 << configSymbolName <<
"' not found";
56 return signalPassFailure();
60 auto tile = configOp.getTile();
61 auto tileOp = dyn_cast<TileOp>(tile.getDefiningOp());
63 startConfig.emitError(
"tile operand must be a TileOp");
64 return signalPassFailure();
67 int col = tileOp.getCol();
68 int row = tileOp.getRow();
73 if (configOp.getPacketType()) {
74 isMem = (*configOp.getPacketType() == TracePacketType::Mem);
78 for (
auto &op : configOp.getBody().getOps()) {
79 auto regOp = dyn_cast<TraceRegOp>(op);
84 if (regOp.getField()) {
85 regOp.emitError(
"aie.trace.reg still has field attribute - run "
86 "-aie-trace-pack-reg-writes pass first");
87 return signalPassFailure();
91 auto regName = regOp.getRegName().str();
93 targetModel.lookupRegister(regName, tileID, isMem);
95 regOp.emitError(
"Register '") << regName <<
"' not found for tile ("
96 <<
col <<
", " <<
row <<
")";
97 return signalPassFailure();
102 if (
auto intAttr = llvm::dyn_cast<IntegerAttr>(regOp.getValue())) {
103 value = intAttr.getInt();
105 regOp.emitError(
"value must be an integer after packing");
106 return signalPassFailure();
110 builder.create<AIEX::NpuWrite32Op>(
111 regOp.getLoc(), builder.getUI32IntegerAttr(regInfo->
offset),
112 builder.getUI32IntegerAttr(
value),
114 builder.getI32IntegerAttr(
col),
115 builder.getI32IntegerAttr(
row)
127std::unique_ptr<OperationPass<AIE::DeviceOp>>
129 return std::make_unique<AIEInlineTraceConfigPass>();
std::shared_ptr< Value > value()
std::unique_ptr< mlir::OperationPass< AIE::DeviceOp > > createAIEXInlineTraceConfigPass()
Include the generated interface declarations.
TileID { friend std::ostream &operator<<(std::ostream &os, const TileID &s) { os<< "TileID("<< s.col<< ", "<< s.row<< ")" TileID