aboutsummaryrefslogtreecommitdiffstats
path: root/sources/api/pySoftMC/pySoftMC.cpp
blob: f8be72e1a6fe67c18940a1449edc372af5189081 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include "platform.h"
#include "instruction.h"
#include "prog.h"

#include <pybind11/pybind11.h>
namespace py = pybind11;

PYBIND11_MODULE(pySoftMC, m) 
{
  py::enum_<PC_TYPE>(m, "PC_TYPE")
      .value("WRITE", PC_TYPE::WRITE)
      .value("READ",  PC_TYPE::READ)
      .value("PRE",   PC_TYPE::PRE)
      .value("ACT",   PC_TYPE::ACT)
      .value("SEL_CH", PC_TYPE::SEL_CH)
      .value("REF",   PC_TYPE::REF)
      .value("CYC",   PC_TYPE::CYC)
      .export_values();

  m.def("SMC_LD",    &SMC_LD,    py::arg("rb"),   py::arg("offset"), py::arg("rt"));
  m.def("SMC_ST",    &SMC_ST,    py::arg("rb"),   py::arg("offset"), py::arg("rt"));

  m.def("SMC_AND",   &SMC_AND,   py::arg("rs1"),  py::arg("rs2"),    py::arg("rt"));
  m.def("SMC_OR",    &SMC_OR,    py::arg("rs1"),  py::arg("rs2"),    py::arg("rt"));
  m.def("SMC_XOR",   &SMC_XOR,   py::arg("rs1"),  py::arg("rs2"),    py::arg("rt"));
  m.def("SMC_ADD",   &SMC_ADD,   py::arg("rs1"),  py::arg("rs2"),    py::arg("rt"));
  m.def("SMC_ADDI",  &SMC_ADDI,  py::arg("rs1"),  py::arg("imd"),    py::arg("rt"));
  m.def("SMC_SUB",   &SMC_SUB,   py::arg("rs1"),  py::arg("rs2"),    py::arg("rt"));
  m.def("SMC_SUBI",  &SMC_SUBI,  py::arg("rs1"),  py::arg("imd"),    py::arg("rt"));
  m.def("SMC_SRC",   &SMC_SRC,   py::arg("rs1"),  py::arg("rt"));

  m.def("SMC_LI",    &SMC_LI,    py::arg("imd"),  py::arg("rt"));
  m.def("SMC_MV",    &SMC_MV,    py::arg("rs1"),  py::arg("rt"));

  m.def("SMC_LDWD",  &SMC_LDWD,  py::arg("rs1"),  py::arg("offset"));
  m.def("SMC_LDPC",  &SMC_LDPC,  py::arg("type"), py::arg("rt"));

  m.def("SMC_BL",    &SMC_BL,    py::arg("rs1"),  py::arg("rs2"),    py::arg("tgt"));
  m.def("SMC_BEQ",   &SMC_BEQ,   py::arg("rs1"),  py::arg("rs2"),    py::arg("tgt"));
  m.def("SMC_JUMP",  &SMC_JUMP,  py::arg("tgt"));

  m.def("SMC_END",   &SMC_END);
  m.def("SMC_INFO",  &SMC_INFO,  py::arg("rdcnt"));
  m.def("SMC_SLEEP", &SMC_SLEEP, py::arg("samt"));

  m.def("SMC_WRITE", &SMC_WRITE, py::arg("bar"),  py::arg("ibar"),   py::arg("car"), py::arg("icar"), py::arg("BL4"), py::arg("ap"));
  m.def("SMC_READ",  &SMC_READ,  py::arg("bar"),  py::arg("ibar"),   py::arg("car"), py::arg("icar"), py::arg("BL4"), py::arg("ap"));
  m.def("SMC_PRE",   &SMC_PRE,   py::arg("bar"),  py::arg("ibar"),   py::arg("pall"), py::arg("rank") = 0);
  m.def("SMC_ACT",   &SMC_ACT,   py::arg("bar"),  py::arg("ibar"),   py::arg("rar"), py::arg("irar"), py::arg("rank") = 0);
  m.def("SMC_SEL_CH", &SMC_SEL_CH, py::arg("channel"), py::arg("pseudo_channel") = 0);

  m.def("SMC_REF",   &SMC_REF);
  m.def("SMC_NOP",   &SMC_NOP);
  m.def("SMC_SRE",   &SMC_SRE);
  m.def("SMC_SRX",   &SMC_SRX);

  m.def("__pack_mininsts",  &__pack_mininsts, py::arg("i1"), py::arg("i2"), py::arg("i3"), py::arg("i4"));

  py::class_<SoftMCPlatform>(m, "SoftMCPlatform")
    .def(py::init())
    .def(py::init<int>(), py::arg("dimm_select"))
    .def("init",              &SoftMCPlatform::init)
    .def("reset_fpga",        &SoftMCPlatform::reset_fpga)
    .def("execute",           &SoftMCPlatform::execute,     py::arg("program"))
    .def("receiveData",       &SoftMCPlatform::py_receiveData, py::arg("num_words"))
    .def("get_buffer_memoryview", &SoftMCPlatform::get_buffer_memoryview)
    .def("set_aref",          &SoftMCPlatform::set_aref,    py::arg("on"))
    .def("readRegisterDump",  &SoftMCPlatform::readRegisterDump)
    .def("count_bitflips_in_row", &SoftMCPlatform::count_bitflips_in_row, py::arg("char_data"));

  py::class_<Program> program(m, "Program");

  py::enum_<Program::SEQ_TYPE>(program, "SEQ_TYPE")
    .value("WRITE", Program::SEQ_TYPE::WRITE)
    .value("READ",  Program::SEQ_TYPE::READ)
    .export_values();

  py::enum_<Program::BR_TYPE>(program, "BR_TYPE")
    .value("BEQ",   Program::BR_TYPE::BEQ)
    .value("BL",    Program::BR_TYPE::BL)
    .value("JUMP",  Program::BR_TYPE::JUMP)
    .export_values();

  program
    .def(py::init())
    .def("add_mininst",         &Program::add_mininst,  py::arg("mi"), py::arg("wait_after"))
    .def("add_wait",            &Program::add_wait,     py::arg("wait_cycles"))
    .def("pack_minprogram",     &Program::pack_minprogram)
    .def("add_inst",            py::overload_cast<Inst>(&Program::add_inst),     py::arg("inst"))
    .def("add_inst",            py::overload_cast<Mininst, Mininst, Mininst, Mininst>(&Program::add_inst))
    .def("add_label",           &Program::add_label,    py::arg("name"))
    .def("add_branch",          &Program::add_branch,   py::arg("type"), py::arg("rs1"), py::arg("rs2"), py::arg("tgt"))
    .def("add_below",           &Program::add_below)
    .def("pretty_print",        &Program::pretty_print)
    .def("dump_registers",      &Program::dump_registers);
}