Merge "plugins/randomgenerator: add deterministic PRNG plugin"
This commit is contained in:
10
src/plugins/randomgenerator/CMakeLists.txt
Normal file
10
src/plugins/randomgenerator/CMakeLists.txt
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
set(PLUGIN_NAME randomgenerator)
|
||||||
|
|
||||||
|
set(MY_PLUGIN_SRCS
|
||||||
|
RandomGenerator.cc
|
||||||
|
RandomGenerator.hpp
|
||||||
|
)
|
||||||
|
include_directories(${CMAKE_CURRENT_BINARY_DIR})
|
||||||
|
|
||||||
|
## Build library
|
||||||
|
add_library(fail-${PLUGIN_NAME} ${MY_PLUGIN_SRCS})
|
||||||
25
src/plugins/randomgenerator/RandomGenerator.cc
Normal file
25
src/plugins/randomgenerator/RandomGenerator.cc
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
#include "RandomGenerator.hpp"
|
||||||
|
#include "sal/Listener.hpp"
|
||||||
|
#include "sal/Memory.hpp"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
using namespace fail;
|
||||||
|
|
||||||
|
bool RandomGenerator::run()
|
||||||
|
{
|
||||||
|
m_log << "RandomGenerator started. @ " << m_symbol << std::endl;
|
||||||
|
|
||||||
|
MemoryManager& mm = simulator.getMemoryManager();
|
||||||
|
MemReadListener l_mem(m_symbol.getAddress());
|
||||||
|
|
||||||
|
uint32_t value = m_seed;
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
simulator.addListenerAndResume(&l_mem);
|
||||||
|
|
||||||
|
value = value * 1103515245 + 12345;
|
||||||
|
|
||||||
|
mm.setBytes(m_symbol.getAddress(), sizeof(value), &value);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
38
src/plugins/randomgenerator/RandomGenerator.hpp
Normal file
38
src/plugins/randomgenerator/RandomGenerator.hpp
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
#ifndef __RandomGenerator_HPP__
|
||||||
|
#define __RandomGenerator_HPP__
|
||||||
|
|
||||||
|
#include <unistd.h>
|
||||||
|
#include "efw/ExperimentFlow.hpp"
|
||||||
|
#include "config/FailConfig.hpp"
|
||||||
|
#include "util/Logger.hpp"
|
||||||
|
#include "util/ElfReader.hpp"
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* @brief A deterministic pseudo-random number generator
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @class RandomGenerator
|
||||||
|
* @brief Plugin to provide deterministic pseudo-random numbers on a specific memory location
|
||||||
|
*/
|
||||||
|
class RandomGenerator : public fail::ExperimentFlow
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
const fail::ElfSymbol m_symbol; //!< the target's memory symbol the plugin is listening on to generate value
|
||||||
|
fail::Logger m_log; //!< debug output
|
||||||
|
const unsigned m_seed; //!< PRNG seed value
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*
|
||||||
|
* @param symbol The resulting random is placed in the SUT symbol
|
||||||
|
* @param seed seed value for PRNG
|
||||||
|
*/
|
||||||
|
RandomGenerator( const fail::ElfSymbol & symbol, unsigned seed ) : m_symbol(symbol), m_log("RandGen", false), m_seed(seed){}
|
||||||
|
|
||||||
|
bool run();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // __RandomGenerator_HPP__
|
||||||
Reference in New Issue
Block a user