import argparse
import importlib.metadata as md
import os
import site
import sys
HEADER = 16 CASE_IN = 4 CASE_OUT = 8
def versions():
for name in ("mlir_aie", "llvm-aie"):
try:
print(f"{name} {md.version(name)}")
except md.PackageNotFoundError:
print(f"{name} absent")
def main():
ap = argparse.ArgumentParser()
ap.add_argument("--versions", action="store_true")
ap.add_argument("--kernel")
ap.add_argument("--rnd", type=int)
ap.add_argument("--sh", type=int)
ap.add_argument("--last-add", type=int, choices=[0, 1])
ap.add_argument("--line", type=int)
ap.add_argument("--lines", type=int)
ap.add_argument("--device", default="npu2")
ap.add_argument("--xclbin")
ap.add_argument("--insts")
a = ap.parse_args()
if a.versions:
versions()
return
if "PEANO_INSTALL_DIR" not in os.environ:
for d in site.getsitepackages():
if os.path.isdir(os.path.join(d, "llvm-aie", "bin")):
os.environ["PEANO_INSTALL_DIR"] = os.path.join(d, "llvm-aie")
break
import numpy as np
import aie.iron as iron
from aie.iron import CompileTime, In, ObjectFifo, Out, Program, Runtime, Worker
from aie.iron.device import from_name
from aie.iron.kernel import ExternalFunction
source = open(a.kernel).read()
line, lines = a.line, a.lines
flags = [f"-DRND={a.rnd}", f"-DSH={a.sh}", f"-DLAST_ADD={a.last_add}"]
@iron.jit
def design(inp: In, out: Out, *, n: CompileTime[int]):
lin = np.ndarray[(HEADER + CASE_IN * line,), np.dtype[np.int32]]
lout = np.ndarray[(CASE_OUT * line,), np.dtype[np.int32]]
vin = np.ndarray[(n * (HEADER + CASE_IN * line),), np.dtype[np.int32]]
vout = np.ndarray[(n * CASE_OUT * line,), np.dtype[np.int32]]
of_in = ObjectFifo(lin, name="in")
of_out = ObjectFifo(lout, name="out")
kernel = ExternalFunction("wq_line", source_string=source, arg_types=[lin, lout, np.int32], compile_flags=flags)
def core(of_in, of_out, kernel):
o = of_out.acquire(1)
i = of_in.acquire(1)
kernel(i, o, line)
of_in.release(1)
of_out.release(1)
worker = Worker(core, [of_in.cons(), of_out.prod(), kernel])
def sequence(x, y, in_h, out_h):
in_h.fill(x)
out_h.drain(y, wait=True)
rt = Runtime(sequence, [vin, vout, of_in.prod(), of_out.cons()])
return Program(iron.get_current_device(), rt, workers=[worker]).resolve_program()
iron.set_current_device(from_name(a.device, n_cols=1))
design.specialize(n=lines).compile(xclbin_path=a.xclbin, inst_path=a.insts)
if __name__ == "__main__":
sys.exit(main())