#ifndef morpheo_behavioural_Constants_h #define morpheo_behavioural_Constants_h /* WARNING : I Use reserved exception : 0x10 - EXCEPTION_MEMORY_MISS_SPECULATION - Load miss speculation 0x11 - EXCEPTION_MEMORY_LOAD_SPECULATIVE - The load is speculative : write in register file, but don't commit 0x12 - EXCEPTION_ALU_SPR_ACCESS_INVALID - SPR present in ALU but not compatible privilege 0x13 - EXCEPTION_ALU_SPR_ACCESS_MUST_READ - SPR not present in ALU 0x14 - EXCEPTION_ALU_SPR_ACCESS_MUST_WRITE - SPR not present in ALU I Use reserved SPR : [0][21] - SPR_CID : Context Id [0][22] - SPR_TID : Thread Id [0][23] - SPR_TSR : Thread Status Register (Priority) */ #include "Common/include/ToString.h" namespace morpheo { namespace behavioural { # define SET_FLAG( x,pos) {(x) |= (1<<(pos));} while (0) # define UNSET_FLAG( x,pos) {(x) &= ~(1<<(pos));} while (0) # define IS_SET_FLAG( x,pos) (((x) & (1<<(pos))) != 0) # define IS_UNSET_FLAG(x,pos) (((x) & (1<<(pos))) == 0) # define CHANGE_FLAG( x,pos,f) \ { \ if (f) \ {SET_FLAG(x,pos);} \ else \ {UNSET_FLAG(x,pos);} \ } while (0) //=========================================================[ Type ]===== typedef enum { TYPE_ALU = 0x0, // 00000 - unit multiple TYPE_SHIFT = 0x1, // 00000 - unit multiple TYPE_MOVE = 0x2, // 00000 - unit multiple TYPE_TEST = 0x3, // 00000 - unit multiple TYPE_MUL = 0x4, // 00000 - unit multiple TYPE_DIV = 0x5, // 00000 - unit multiple, type optionnal TYPE_EXTEND = 0x6, // 00000 - unit multiple, type optionnal TYPE_FIND = 0x7, // 00000 - unit multiple, type optionnal TYPE_SPECIAL = 0x8, // 00000 - unit uniq TYPE_CUSTOM = 0x9, // 00000 - unit uniq , type optionnal TYPE_BRANCH = 0xa, // 00000 - unit multiple TYPE_MEMORY = 0xb // 00000 - unit uniq } type_t; //#define NB_TYPE 11 # define SIZE_TYPE 5 # define MAX_TYPE (1< incondionnal # define BRANCH_STATE_SPEC_NTAKE 0x2 // 1 0 # define BRANCH_STATE_SPEC_TAKE 0x3 // 1 1 //---------------------------------------------[ branch_condition ]----- # define SIZE_BRANCH_CONDITION 4 # define MAX_BRANCH_CONDITION (1< inline std::string toString(const morpheo::behavioural::type_t& x) { switch (x) { case morpheo::behavioural::TYPE_ALU : return "ALU" ; case morpheo::behavioural::TYPE_SHIFT : return "SHIFT" ; case morpheo::behavioural::TYPE_MOVE : return "MOVE" ; case morpheo::behavioural::TYPE_TEST : return "TEST" ; case morpheo::behavioural::TYPE_MUL : return "MUL" ; case morpheo::behavioural::TYPE_DIV : return "DIV" ; case morpheo::behavioural::TYPE_EXTEND : return "EXTEND" ; case morpheo::behavioural::TYPE_FIND : return "FIND" ; case morpheo::behavioural::TYPE_SPECIAL : return "SPECIAL" ; case morpheo::behavioural::TYPE_CUSTOM : return "CUSTOM" ; case morpheo::behavioural::TYPE_BRANCH : return "BRANCH" ; case morpheo::behavioural::TYPE_MEMORY : return "MEMORY" ; default : return ""; } }; template<> inline std::string toString(const morpheo::behavioural::branch_condition_t& x) { switch (x) { case morpheo::behavioural::BRANCH_CONDITION_NONE_WITHOUT_WRITE_STACK : return "none_without_write_stack" ; case morpheo::behavioural::BRANCH_CONDITION_NONE_WITH_WRITE_STACK : return "none_with_write_stack" ; case morpheo::behavioural::BRANCH_CONDITION_FLAG_UNSET : return "flag_unset" ; case morpheo::behavioural::BRANCH_CONDITION_FLAG_SET : return "flag_set" ; case morpheo::behavioural::BRANCH_CONDITION_READ_REGISTER_WITHOUT_WRITE_STACK : return "read_register_without_write_stack"; case morpheo::behavioural::BRANCH_CONDITION_READ_REGISTER_WITH_WRITE_STACK : return "read_register_with_write_stack" ; case morpheo::behavioural::BRANCH_CONDITION_READ_STACK : return "read_stack" ; default : return ""; } }; }; // end namespace morpheo #endif