HAL  v4.5.0-83-g30c8f0afc
The Hardware Analyzer - a comprehensive reverse engineering and manipulation framework for gate-level netlists.
simulation_engine.cpp
Go to the documentation of this file.
2 
6 
7 #include <QDir>
8 #include <QProcess>
9 #include <QThread>
10 #include <QFile>
11 #include <QFileInfo>
12 #include <QDir>
13 
14 namespace hal
15 {
16  SimulationEngine::SimulationEngine(const std::string& nam)
17  : mName(nam), mRequireClockEvents(false), mCanShareMemory(false), mState(Preparing),
18  mSimulationInput(nullptr)
19  {;}
20 
22  {
23  return mWorkDir;
24  }
25 
26  void SimulationEngine::set_working_directory(const std::string& workDir)
27  {
28  mWorkDir = workDir;
29  }
30 
32  {
33  mState = Done;
34  return true;
35  }
36 
38  {
39  mState = Failed;
40  }
41 
42  bool SimulationEngine::install_saleae_parser(std::string dirname) const
43  {
44  QDir dir(QString::fromStdString(dirname));
45  if (!dir.exists()) return false;
46  const char* filenames[] = {":/include/saleae_parser.h", ":/src/saleae_parser.cpp",
47  ":/include/saleae_file.h", ":/src/saleae_file.cpp",
48  ":/include/saleae_directory.h", ":/src/saleae_directory.cpp", nullptr};
49  for (int i=0; filenames[i]; i++)
50  {
51  // add STAMDALONE_PARSER preprocessor directive to all source files
52  QFileInfo finfo(filenames[i]);
53  QString targetFile = dir.absoluteFilePath(finfo.fileName());
54  QFile ff(filenames[i]);
55  if (!ff.open(QIODevice::ReadOnly)) return false;
56  QFile of(targetFile);
57  if (!of.open(QIODevice::WriteOnly)) return false;
58  of.write("#define STANDALONE_PARSER 1\n");
59  of.write(ff.readAll());
60  }
61  return true;
62  }
63 
64  void SimulationEngine::set_engine_property(const std::string& key, const std::string& value)
65  {
66  mProperties[key] = value;
67  }
68 
69  std::string SimulationEngine::get_engine_property(const std::string& key)
70  {
71  if (mProperties.find(key) != mProperties.end())
72  {
73  return mProperties[key];
74  }
75 
76  return std::string();
77  }
78 
80  {
81  mCanShareMemory = true;
82  }
83 
84  std::vector<WaveEvent> SimulationEngineEventDriven::get_simulation_events(u32 netId) const
85  {
86  Q_UNUSED(netId);
87  return std::vector<WaveEvent>();
88  }
89 
90  bool SimulationEngineEventDriven::setSimulationInput(SimulationInput* simInput)
91  {
92  mSimulationInput = simInput;
93  return true;
94  }
95 
96  bool SimulationEngineEventDriven::run(NetlistSimulatorController* controller, SimulationLogReceiver *logReceiver)
97  {
98  Q_UNUSED(logReceiver);
99  SimulationThread* thread = new SimulationThread(controller, mSimulationInput, this);
100  mState = Running;
101  thread->start();
102  return true;
103  }
104 
105  bool SimulationEngineScripted::run(NetlistSimulatorController* controller, SimulationLogReceiver *logReceiver)
106  {
107  SimulationProcess* proc = new SimulationProcess(controller, this);
108  proc->log()->setLogReceiver(logReceiver);
109  mState = Running;
110  proc->start();
111  return true;
112  }
113 
114  //======================= FACTORY ================================
115  SimulationEngineFactory::SimulationEngineFactory(const std::string& nam) : mName(nam)
116  {
117  SimulationEngineFactories::instance()->push_back(this);
118  }
119 
120  SimulationEngineFactories* SimulationEngineFactories::inst = nullptr;
121 
123  {
124  if (!inst)
125  inst = new SimulationEngineFactories;
126  return inst;
127  }
128 
129  std::vector<std::string> SimulationEngineFactories::factoryNames() const
130  {
131  std::vector<std::string> retval;
132  for (auto it = begin(); it != end(); ++it)
133  retval.push_back((*it)->name());
134  return retval;
135  }
136 
138  {
139  for (auto it = begin(); it != end(); ++it)
140  if ((*it)->name() == nam)
141  return (*it);
142 
143  return nullptr;
144  }
145 
146  void SimulationEngineFactories::deleteFactory(const std::string nam)
147  {
148  auto it = begin();
149  while (it != end())
150  {
151  if ((*it)->name() == nam)
152  {
153  delete (*it);
154  it = erase(it);
155  }
156  else
157  ++it;
158  }
159  }
160 
161 } // namespace hal
virtual std::vector< WaveEvent > get_simulation_events(u32 netId) const
SimulationEngineEventDriven(const std::string &nam)
void deleteFactory(const std::string nam)
std::vector< std::string > factoryNames() const
static SimulationEngineFactories * instance()
SimulationEngineFactory * factoryByName(const std::string nam) const
SimulationEngineFactory(const std::string &nam)
SimulationEngine(const std::string &nam)
std::string get_working_directory() const
virtual void set_engine_property(const std::string &key, const std::string &value)
virtual std::string get_engine_property(const std::string &key)
SimulationInput * mSimulationInput
bool install_saleae_parser(std::string dirname) const
std::unordered_map< std::string, std::string > mProperties
void set_working_directory(const std::string &workDir)
uint32_t u32
Definition: defines.h:41
Definition: defines.h:45
QString absoluteFilePath(const QString &fileName) const const
bool exists() const const
virtual bool open(QIODevice::OpenMode mode) override
QString fileName() const const
qint64 write(const char *data, qint64 maxSize)
QString fromStdString(const std::string &str)