#include <fstream>
#include <iostream>
#include <cstdint>

#include <poplar/DeviceManager.hpp>
#include <poplar/Engine.hpp>
#include <poplar/Executable.hpp>

int main(int argc, char **argv) {
  if (argc != 2) {
    std::cerr << "usage: load_executable EXECUTABLE\n";
    return 2;
  }
  std::ifstream input(argv[1], std::ios::binary);
  if (!input) {
    std::cerr << "failed to open executable: " << argv[1] << '\n';
    return 2;
  }
  auto executable = poplar::Executable::deserialize(input);
  poplar::Engine engine(executable);
  poplar::DeviceManager manager;
  auto devices = manager.getDevices(poplar::TargetType::IPU, 1);
  if (devices.empty() || !devices[0].attach()) {
    std::cerr << "failed to attach an IPU\n";
    return 3;
  }
  engine.load(devices[0]);
  std::cout << "load=PASS\n";
  return 0;
}
