46std::unique_ptr<OperationPool>
pool =
nullptr;
62 const char* opName, uint8_t width,
const uint64_t* inputs,
72 std::string(
"ExecuteInstruction error: No behavior "
73 "implementation found for operation '") +
79 throw std::logic_error(
80 std::string(
"ExecuteInstruction error: No behavior "
81 "implementation found for operation '") +
92 std::string(
"ExecuteInstruction error: Not enough input values"));
97 const int opValues = opInputs + opOutputs;
99 std::vector<std::unique_ptr<SimValue>> simValues(opValues);
101 for (
int i = 0; i < opInputs; ++i) {
102 simValues[i] = std::make_unique<SimValue>(inputs[i], width);
104 for (
int i = 0; i < opOutputs; ++i) {
105 simValues[opInputs + i] = std::make_unique<SimValue>(0, width);
108 std::vector<SimValue*> simValPtrs(opValues);
109 for (
int i = 0; i < opValues; ++i) {
110 simValPtrs[i] = simValues[i].get();
118 "ExecuteInstruction error: operation execution failed"));
121 std::vector<SimValue> results(opOutputs);
122 for (
int i = 0; i < opOutputs; i++) {
123 results[i] = *simValues[opInputs + i];
148 std::unique_ptr<TTAMachine::Machine>
machine =
nullptr;
151 machine = std::unique_ptr<TTAMachine::Machine>(
154 if (error !=
nullptr) {
155 std::string errorStr =
156 std::string(
"InitializeMachine error: ") + e.
errorMessage();
157 *error = strdup(errorStr.c_str());
162 if (bem ==
nullptr) {
163 *error = strdup(
"InitializeMachine error: failed to generate bem");
170 "InitializeMachine error: failed to generate custom ops map");
212 "UnpackInstruction error: customOps map is empty. Did you "
213 "initialize the machine first?");
217 if (output ==
nullptr) {
218 if (error !=
nullptr) {
220 strdup(
"UnpackInstruction error: Output parameter is null");
235 if (!isCustom0 && !isCustom1) {
236 if (error !=
nullptr) {
237 *error = strdup(
"UnpackInstruction error: Unknown base opcode");
242 std::string opName =
"";
244 uint32_t encoding = op.second;
245 bool isMatch =
false;
259 *output = strdup(op.first.c_str());
264 if (error !=
nullptr) {
265 *error = strdup(
"UnpackInstruction error: Operation not found");
287 const char* opName,
const uint32_t* inputs, uint32_t inputsCount,
288 uint32_t* output,
char** error) {
289 if (output ==
nullptr) {
290 if (error !=
nullptr) {
292 "ExecuteInstruction32 error: Output parameter is null");
298 std::vector<uint64_t> inputs64(inputsCount);
299 for (uint32_t i = 0; i < inputsCount; i++) {
300 inputs64[i] =
static_cast<uint64_t
>(inputs[i]);
303 std::vector<SimValue> results =
305 opName, 32, inputs64.data(), inputsCount);
306 for (
size_t i = 0; i < results.size(); i++) {
307 output[i] = results.at(i).uIntWordValue();
311 if (error !=
nullptr) {
336 const char* opName,
const uint64_t* inputs, uint32_t inputsCount,
337 uint64_t* output,
char** error) {
338 if (output ==
nullptr) {
339 if (error !=
nullptr) {
341 "ExecuteInstruction64 error: Output parameter is null");
347 std::vector<SimValue> results =
349 opName, 64, inputs, inputsCount);
350 for (
size_t i = 0; i < results.size(); i++) {
351 output[i] = results.at(i).uLongWordValue();
355 if (error !=
nullptr) {
TTAMachine::Machine * machine
the architecture definition of the estimated processor
#define THROW_EXCEPTION(exceptionType, message)
Exception wrapper macro that automatically includes file name, line number and function name where th...
int executeInstruction32(const char *opName, const uint32_t *inputs, uint32_t inputsCount, uint32_t *output, char **error)
int initializeMachine(const char *machinePath, char **error)
int executeInstruction64(const char *opName, const uint64_t *inputs, uint32_t inputsCount, uint64_t *output, char **error)
int unpackInstruction(uint32_t instruction, char **output, char **error)
BinaryEncoding * generate()
std::string errorMessage() const
static NullOperationBehavior & instance()
static NullOperation & instance()
virtual void createState(OperationContext &context) const
virtual bool simulateTrigger(SimValue **io, OperationContext &context) const =0
virtual void deleteState(OperationContext &context) const
virtual OperationBehavior & behavior() const
virtual int numberOfInputs() const
virtual int numberOfOutputs() const
static Machine * loadFromADF(const std::string &adfFileName)
constexpr unsigned OPC_CUSTOM_0
std::unique_ptr< OperationPool > pool
std::map< std::string, int > customOps
std::vector< SimValue > executeInstructionHelper(const char *opName, uint8_t width, const uint64_t *inputs, int inputsCount)
constexpr unsigned OPC_CUSTOM_1