10 #ifndef EMP_AVIDA_CPU_INST_LIB_H 11 #define EMP_AVIDA_CPU_INST_LIB_H 13 #include "../tools/math.h" 22 template <
typename HARDWARE_T,
typename ARG_T=
size_t,
size_t ARG_COUNT=3>
27 using inst_t =
typename hardware_t::inst_t;
39 hw.regs[inst.args[0]] = (hw.regs[inst.args[0]] == 0.0);
42 hw.regs[inst.args[0]] = (double) inst.args[1];
45 hw.regs[inst.args[2]] = hw.regs[inst.args[0]] + hw.regs[inst.args[1]];
48 hw.regs[inst.args[2]] = hw.regs[inst.args[0]] - hw.regs[inst.args[1]];
51 hw.regs[inst.args[2]] = hw.regs[inst.args[0]] * hw.regs[inst.args[1]];
55 const double denom = hw.regs[inst.args[1]];
56 if (denom == 0.0) ++hw.errors;
57 else hw.regs[inst.args[2]] = hw.regs[inst.args[0]] / denom;
61 const double base = hw.regs[inst.args[1]];
62 if (base == 0.0) ++hw.errors;
63 else hw.regs[inst.args[2]] =
emp::Mod( hw.regs[inst.args[0]], base);
68 hw.regs[inst.args[2]] = (hw.regs[inst.args[0]] == hw.regs[inst.args[1]]);
71 hw.regs[inst.args[2]] = (hw.regs[inst.args[0]] != hw.regs[inst.args[1]]);
74 hw.regs[inst.args[2]] = (hw.regs[inst.args[0]] < hw.regs[inst.args[1]]);
79 if (hw.UpdateScope(inst.args[1]) ==
false)
return;
80 if (hw.regs[inst.args[0]] == 0.0) hw.BypassScope(inst.args[1]);
86 if (hw.regs[inst.args[0]] == 0.0) hw.BypassScope(inst.args[1]);
92 if (hw.regs[inst.args[0]] == 0.0) hw.BypassScope(inst.args[1]);
93 else hw.regs[inst.args[0]]--;
100 if (hw.UpdateScope(inst.args[1]) ==
false)
return;
101 hw.fun_starts[inst.args[0]] = (int) hw.inst_ptr;
102 hw.BypassScope(inst.args[1]);
107 size_t def_pos = (size_t) hw.fun_starts[inst.args[0]];
108 if (def_pos >= hw.genome.sequence.size()
112 size_t fun_scope = hw.genome.sequence[def_pos].args[1];
114 hw.call_stack.push_back(hw.inst_ptr+1);
115 hw.inst_ptr = def_pos+1;
119 hw.PushStack(inst.args[1], hw.regs[inst.args[0]]);
122 hw.regs[inst.args[1]] = hw.PopStack(inst.args[0]);
127 int input_id = (int) hw.regs[ inst.args[0] ];
128 hw.regs[inst.args[1]] =
Find(hw.inputs, input_id, 0.0);
133 int output_id = (int) hw.regs[ inst.args[1] ];
134 hw.outputs[output_id] = hw.regs[inst.args[0]];
138 hw.regs[inst.args[1]] = hw.regs[inst.args[0]];
142 hw.reg_stack.emplace_back(hw.CurScope(), inst.args[0], hw.regs[inst.args[0]]);
151 inst_lib.
AddInst(
"Not",
Inst_Not, 1,
"Logically toggle value in reg Arg1");
167 inst_lib.
AddInst(
"Call",
Inst_Call, 1,
"Call previously defined function Arg1");
170 inst_lib.
AddInst(
"Input",
Inst_Input, 2,
"Pull next value from input Arg1 into reg Arg2");
175 for (
size_t i = 0; i < hardware_t::CPU_SIZE; i++) {
static void Inst_Pop(hardware_t &hw, const inst_t &inst)
Definition: AvidaCPU_InstLib.h:121
static void Inst_Add(hardware_t &hw, const inst_t &inst)
Definition: AvidaCPU_InstLib.h:44
static void Inst_Scope(hardware_t &hw, const inst_t &inst)
Definition: AvidaCPU_InstLib.h:97
static void Inst_CopyVal(hardware_t &hw, const inst_t &inst)
Definition: AvidaCPU_InstLib.h:137
This file maintains information about instructions availabel in virtual hardware. ...
std::string to_string(ALL_TYPES &&...all_values)
Definition: string_utils.h:511
Definition: AvidaCPU_InstLib.h:23
static void Inst_ScopeReg(hardware_t &hw, const inst_t &inst)
Definition: AvidaCPU_InstLib.h:141
static void Inst_Mod(hardware_t &hw, const inst_t &inst)
Definition: AvidaCPU_InstLib.h:60
static void Inst_SetReg(hardware_t &hw, const inst_t &inst)
Definition: AvidaCPU_InstLib.h:41
static void Inst_TestEqu(hardware_t &hw, const inst_t &inst)
Definition: AvidaCPU_InstLib.h:67
void AddArg(const std::string &name, arg_t value)
Specify a keyword and arg value.
Definition: InstLib.h:155
size_t GetSize() const
Get the number of instructions in this set.
Definition: InstLib.h:99
HARDWARE_T hardware_t
Definition: AvidaCPU_InstLib.h:24
typename hardware_t::inst_t inst_t
Definition: AvidaCPU_InstLib.h:27
static void Inst_Countdown(hardware_t &hw, const inst_t &inst)
Definition: AvidaCPU_InstLib.h:89
static void Inst_While(hardware_t &hw, const inst_t &inst)
Definition: AvidaCPU_InstLib.h:83
emp::vector< InstDef > inst_lib
Full definitions for instructions.
Definition: InstLib.h:60
static void Inst_Input(hardware_t &hw, const inst_t &inst)
Definition: AvidaCPU_InstLib.h:125
ARG_T arg_t
Definition: AvidaCPU_InstLib.h:25
static constexpr size_t arg_count
Definition: AvidaCPU_InstLib.h:29
static void Inst_Break(hardware_t &hw, const inst_t &inst)
Definition: AvidaCPU_InstLib.h:96
auto Find(const MAP_T &in_map, const KEY_T &key, const typename MAP_T::mapped_type &dval)
Definition: map_utils.h:29
constexpr int Mod(int in_val, int mod_val)
% is actually remainder; Mod is a proper modulus command that handles negative #'s correctly ...
Definition: math.h:26
static void Inst_Sub(hardware_t &hw, const inst_t &inst)
Definition: AvidaCPU_InstLib.h:47
static void Inst_TestLess(hardware_t &hw, const inst_t &inst)
Definition: AvidaCPU_InstLib.h:73
static void Inst_Define(hardware_t &hw, const inst_t &inst)
Definition: AvidaCPU_InstLib.h:99
static void Inst_Dec(hardware_t &hw, const inst_t &inst)
Definition: AvidaCPU_InstLib.h:35
static void Inst_Not(hardware_t &hw, const inst_t &inst)
Definition: AvidaCPU_InstLib.h:38
static void Inst_TestNEqu(hardware_t &hw, const inst_t &inst)
Definition: AvidaCPU_InstLib.h:70
If we are in emscripten, make sure to include the header.
Definition: array.h:37
static void Inst_Call(hardware_t &hw, const inst_t &inst)
Definition: AvidaCPU_InstLib.h:105
static void Inst_If(hardware_t &hw, const inst_t &inst)
Definition: AvidaCPU_InstLib.h:78
void AddInst(const std::string &name, const fun_t &fun_call, size_t num_args=0, const std::string &desc="", ScopeType scope_type=ScopeType::NONE, size_t scope_arg=(size_t)-1, const inst_properties_t &inst_properties=inst_properties_t())
Add a new instruction to the set.
Definition: InstLib.h:140
InstLib maintains a set of instructions for use in virtual hardware.
Definition: InstLib.h:34
static void Inst_Div(hardware_t &hw, const inst_t &inst)
Definition: AvidaCPU_InstLib.h:54
static void Inst_Inc(hardware_t &hw, const inst_t &inst)
Definition: AvidaCPU_InstLib.h:34
static void Inst_Mult(hardware_t &hw, const inst_t &inst)
Definition: AvidaCPU_InstLib.h:50
static const this_t & DefaultInstLib()
Definition: AvidaCPU_InstLib.h:145
static void Inst_Push(hardware_t &hw, const inst_t &inst)
Definition: AvidaCPU_InstLib.h:118
static void Inst_Output(hardware_t &hw, const inst_t &inst)
Definition: AvidaCPU_InstLib.h:131