34 desc.add_options()(
"help,h",
"produce help message")(
35 "xclbin,x", po::value<std::string>()->required(),
36 "the input xclbin path")(
37 "kernel,k", po::value<std::string>()->required(),
38 "the kernel name in the XCLBIN (for instance PP_PRE_FD)")(
39 "verbosity,v", po::value<int>()->default_value(0),
40 "the verbosity of the output")(
41 "instr,i", po::value<std::string>()->required(),
42 "path of file containing userspace instructions sent to the NPU")(
43 "verify", po::value<bool>()->default_value(
true),
44 "whether to verify the AIE computed output")(
45 "iters", po::value<int>()->default_value(1))(
46 "warmup", po::value<int>()->default_value(0))(
47 "trace_sz,t", po::value<int>()->default_value(0))(
48 "trace_file", po::value<std::string>()->default_value(
"trace.txt"),
49 "where to store trace output");
53 po::options_description &desc,
54 po::variables_map &vm) {
56 po::store(po::parse_command_line(argc, argv, desc), vm);
59 if (vm.count(
"help")) {
60 std::cout << desc <<
"\n";
63 }
catch (
const std::exception &ex) {
64 std::cerr << ex.what() <<
"\n\n";
65 std::cerr <<
"Usage:\n" << desc <<
"\n";
72 }
catch (
const std::exception &ex) {
73 std::cerr << ex.what() <<
"\n\n";
82 std::ifstream instr_file(instr_path);
84 std::vector<uint32_t> instr_v;
85 while (std::getline(instr_file, line)) {
86 std::istringstream iss(line);
88 if (!(iss >> std::hex >> a)) {
89 throw std::runtime_error(
"Unable to parse instruction file\n");
98 std::ifstream instr_file(instr_path, std::ios::binary);
99 if (!instr_file.is_open()) {
100 throw std::runtime_error(
"Unable to open instruction file\n");
104 instr_file.seekg(0, std::ios::end);
105 std::streamsize size = instr_file.tellg();
106 instr_file.seekg(0, std::ios::beg);
110 throw std::runtime_error(
"File size is not a multiple of 4 bytes\n");
114 std::vector<uint32_t> instr_v(size / 4);
115 if (!instr_file.read(
reinterpret_cast<char *
>(instr_v.data()), size)) {
116 throw std::runtime_error(
"Failed to read instruction file\n");
125 int verbosity, std::string xclbinFileName,
126 std::string kernelNameInXclbin) {
128 unsigned int device_index = 0;
129 device = xrt::device(device_index);
133 std::cout <<
"Loading xclbin: " << xclbinFileName <<
"\n";
134 auto xclbin = xrt::xclbin(xclbinFileName);
137 std::cout <<
"Kernel opcode: " << kernelNameInXclbin <<
"\n";
140 auto xkernels = xclbin.get_kernels();
142 *std::find_if(xkernels.begin(), xkernels.end(),
143 [kernelNameInXclbin, verbosity](xrt::xclbin::kernel &k) {
144 auto name = k.get_name();
145 if (verbosity >= 1) {
146 std::cout <<
"Name: " << name << std::endl;
148 return name.rfind(kernelNameInXclbin, 0) == 0;
150 auto kernelName = xkernel.get_name();
154 std::cout <<
"Registering xclbin: " << xclbinFileName <<
"\n";
156 device.register_xclbin(xclbin);
160 std::cout <<
"Getting hardware context.\n";
161 xrt::hw_context context(device, xclbin.get_uuid());
165 std::cout <<
"Getting handle to kernel:" << kernelName <<
"\n";
166 kernel = xrt::kernel(context, kernelName);