ETISS 0.11.2
ExtendableTranslatingInstructionSetSimulator(version0.11.2)
Loading...
Searching...
No Matches
MemoryManipulationSystem.h
Go to the documentation of this file.
1// SPDX-License-Identifier: BSD-3-Clause
2//
3// This file is part of ETISS. It is licensed under the BSD 3-Clause License; you may not use this file except in
4// compliance with the License. You should have received a copy of the license along with this project. If not, see the
5// LICENSE file.
13#ifndef ETISS_INCLUDE_INTEGRATEDLIBRARY_FAULT_MEMORYMANIPULATIONSYSTEM_H_
14#define ETISS_INCLUDE_INTEGRATEDLIBRARY_FAULT_MEMORYMANIPULATIONSYSTEM_H_
15
16#include "etiss/Misc.h"
17#include "etiss/make_unique.h"
18#include <fstream>
19
21
22#include "etiss/VirtualStruct.h"
23
24#include <memory>
25#include <map>
26#include <stack>
27
28#include <functional>
29
30#include "etiss/fault/Misc.h"
31#include "enum.h"
32
33namespace etiss
34{
35
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)
38
39
42{
43 public:
44 typedef MM_MemOpType mem_op_t;
48 {
49 public:
52 template <typename word_t>
53 word_t operator()(word_t src1, word_t src2) const;
56 MemOp(const std::string &memop_str) : mem_op_t(mem_op_t::_from_string(memop_str.c_str())) {}
57 } /* class MemOp */;
58
61 typedef MM_MemManipCmd mem_manip_cmd_t;
62
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;
67} /* class MemoryWordManipulatorBase */;
68
71template <typename word_t>
73{
74 private:
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_;
79 std::stack<word_t> memstack_{};
81
82 public:
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);
107} /* class MemoryWordManipulator */;
108
112{
113 public:
116 MemoryManipulationSystem(const std::string &name = "system");
119 inline const std::string &getName() { return name_; }
122 std::shared_ptr<etiss::VirtualStruct> getStruct(void);
125 void init_manipulation(std::shared_ptr<etiss::VirtualStructSupport> vs_parent);
126
127 private:
128 std::string name_;
129 etiss::uint8 arch_width_;
130 std::shared_ptr<etiss::VirtualStruct> vsystem_;
131 std::unique_ptr<etiss::MemoryWordManipulatorBase> mem_manipulator_;
132};
133
134/* template "implemenations" */
135template <typename word_t>
136word_t MemoryWordManipulatorBase::MemOp::operator()(word_t src1, word_t src2) const
137{
138 switch (*this)
139 {
140 case MM_MemOpType::COPY:
141 return src2;
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);
152 default:
153 break;
154 }
155 return src1;
156}
157
158template <typename word_t>
159etiss::int32 MemoryWordManipulator<word_t>::pop(size_t address)
160{
161 etiss::int32 return_code;
162 mem_write_word_(address, memstack_.top(), return_code);
163 memstack_.pop();
164 return return_code;
165}
166
167template <typename word_t>
168etiss::int32 MemoryWordManipulator<word_t>::push(size_t address)
169{
170 etiss::int32 return_code;
171 memstack_.push(mem_read_word_(address, return_code));
172 return return_code;
173}
174
175template <typename word_t>
176etiss::int32 MemoryWordManipulator<word_t>::rmw(size_t address, MemOp op, etiss::uint64 mod_val)
177{
178 etiss::int32 return_code;
179 word_t mem_val = mem_read_word_(address, return_code);
180 if (return_code == RETURNCODE::NOERROR)
181 {
182 mem_val = op(mem_val, static_cast<word_t>(mod_val));
183 mem_write_word_(address, mem_val, return_code);
184 }
185 return return_code;
186}
187template <typename word_t>
188etiss::int32 MemoryWordManipulator<word_t>::rrmw(size_t dstsrc1_address, MemOp op, size_t src2_address)
189{
190 etiss::int32 return_code;
191 word_t src1mem_val = mem_read_word_(dstsrc1_address, return_code);
192 if (return_code == RETURNCODE::NOERROR)
193 {
194 word_t src2mem_val = mem_read_word_(src2_address, return_code);
195 if (return_code == RETURNCODE::NOERROR)
196 {
197 src1mem_val = op(src1mem_val, src2mem_val);
198 mem_write_word_(dstsrc1_address, src1mem_val, return_code);
199 }
200 }
201 return return_code;
202}
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)
208{
209}
210
211} // namespace etiss
212
213#endif // ETISS_INCLUDE_INTEGRATEDLIBRARY_FAULT_MEMORYMANIPULATIONSYSTEM_H_
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
forwards: include/jit/*
Definition Benchmark.h:17