13#ifndef ETISS_INCLUDE_INTEGRATEDLIBRARY_FAULT_MEMORYMANIPULATIONSYSTEM_H_
14#define ETISS_INCLUDE_INTEGRATEDLIBRARY_FAULT_MEMORYMANIPULATIONSYSTEM_H_
36BETTER_ENUM(MM_MemOpType,
char, UNDEF = 0, COPY, AND, OR, XOR, NAND, NOR)
37BETTER_ENUM(MM_MemManipCmd,
char, UNDEF = 0, PUSH, POP, OR, RMW, RRMW)
52 template <
typename word_t>
53 word_t operator()(word_t src1, word_t src2)
const;
63 virtual etiss::int32
push(
size_t address) = 0;
64 virtual etiss::int32
pop(
size_t address) = 0;
65 virtual etiss::int32
rmw(
size_t address,
MemOp op, etiss::uint64 mod_val) = 0;
66 virtual etiss::int32
rrmw(
size_t dstsrc1_address,
MemOp op,
size_t src2_address) = 0;
71template <
typename word_t>
75 std::function<word_t(
size_t address, etiss::int32 &return_code)>
mem_read_word_;
77 std::function<void(
size_t address, word_t val, etiss::int32 &return_code)>
mem_write_word_;
86 virtual etiss::int32
pop(
size_t address);
90 virtual etiss::int32
push(
size_t address);
95 virtual etiss::int32
rmw(
size_t address, MemOp op, etiss::uint64 mod_val);
100 virtual etiss::int32
rrmw(
size_t dstsrc1_address, MemOp op,
size_t src2_address);
105 std::function<word_t(
size_t address, etiss::int32 &return_code)>
const &mem_read_word,
106 std::function<
void(
size_t address, word_t val, etiss::int32 &return_code)>
const &mem_write_word);
122 std::shared_ptr<etiss::VirtualStruct>
getStruct(
void);
135template <
typename word_t>
140 case MM_MemOpType::COPY:
142 case MM_MemOpType::AND:
143 return (src1 & src2);
144 case MM_MemOpType::OR:
145 return (src1 | src2);
146 case MM_MemOpType::XOR:
147 return (src1 ^ src2);
148 case MM_MemOpType::NAND:
149 return ~(src1 & src2);
150 case MM_MemOpType::NOR:
151 return ~(src1 | src2);
158template <
typename word_t>
161 etiss::int32 return_code;
162 mem_write_word_(address, memstack_.top(), return_code);
167template <
typename word_t>
170 etiss::int32 return_code;
171 memstack_.push(mem_read_word_(address, return_code));
175template <
typename word_t>
178 etiss::int32 return_code;
179 word_t mem_val = mem_read_word_(address, return_code);
180 if (return_code == RETURNCODE::NOERROR)
182 mem_val = op(mem_val,
static_cast<word_t
>(mod_val));
183 mem_write_word_(address, mem_val, return_code);
187template <
typename word_t>
190 etiss::int32 return_code;
191 word_t src1mem_val = mem_read_word_(dstsrc1_address, return_code);
192 if (return_code == RETURNCODE::NOERROR)
194 word_t src2mem_val = mem_read_word_(src2_address, return_code);
195 if (return_code == RETURNCODE::NOERROR)
197 src1mem_val = op(src1mem_val, src2mem_val);
198 mem_write_word_(dstsrc1_address, src1mem_val, return_code);
203template <
typename word_t>
205 std::function<word_t(
size_t address, etiss::int32 &return_code)>
const &mem_read_word,
206 std::function<
void(
size_t address, word_t val, etiss::int32 &return_code)>
const &mem_write_word)
207 : mem_read_word_(mem_read_word), mem_write_word_(mem_write_word)
general configuration and logging
simple test system implementation
Simple etiss:System implementation for testing.
std::unique_ptr< etiss::MemoryWordManipulatorBase > mem_manipulator_
std::shared_ptr< etiss::VirtualStruct > vsystem_
const std::string & getName()
get virtual struct associated name
std::shared_ptr< etiss::VirtualStruct > getStruct(void)
get virtual struct
void init_manipulation(std::shared_ptr< etiss::VirtualStructSupport > vs_parent)
initialize this virtual struct and mount it to cpu_core
MemOp(const std::string &memop_str)
Constructor takes string encoded memory operation MemOpType.
word_t operator()(word_t src1, word_t src2) const
executes memory operation with operands src1 and src2 and returns result
Memory word faulter base class.
MM_MemManipCmd mem_manip_cmd_t
Memory operation type code.
virtual etiss::int32 push(size_t address)=0
virtual etiss::int32 rmw(size_t address, MemOp op, etiss::uint64 mod_val)=0
virtual etiss::int32 rrmw(size_t dstsrc1_address, MemOp op, size_t src2_address)=0
virtual etiss::int32 pop(size_t address)=0
Memory word faulter class template word_t.
std::function< void(size_t address, word_t val, etiss::int32 &return_code)> mem_write_word_
function to write a single word to memory
MemoryWordManipulator(std::function< word_t(size_t address, etiss::int32 &return_code)> const &mem_read_word, std::function< void(size_t address, word_t val, etiss::int32 &return_code)> const &mem_write_word)
Constructor taking mem_read_word and mem_write_word functions for memory fault action.
virtual etiss::int32 rmw(size_t address, MemOp op, etiss::uint64 mod_val)
read-modify-write memory word at address with mod_val by bit-wise operation op mod_val is type casted...
std::function< word_t(size_t address, etiss::int32 &return_code)> mem_read_word_
function to read a single word from memory
virtual etiss::int32 rrmw(size_t dstsrc1_address, MemOp op, size_t src2_address)
read-readmodify-write memory word at dstsrc1_address with memory word at src2_address by bit-wise ope...
virtual etiss::int32 pop(size_t address)
pop the last added element from the memory stack and write it to memory address
std::stack< word_t > memstack_
memory stack to allow read modify write manipulations to memory
virtual etiss::int32 push(size_t address)
read memory from address and push it to memory stack
simple etiss:System implementation for testing
general helpers for fault