HAL  v4.5.0-83-g30c8f0afc
The Hardware Analyzer - a comprehensive reverse engineering and manipulation framework for gate-level netlists.
plugin_gui_extension_demo.cpp
Go to the documentation of this file.
5 #include "hal_core/netlist/net.h"
11 #include "hal_core/utilities/log.h"
17 #include "hal_core/netlist/gate.h"
19 
20 #include <thread>
21 
22 namespace hal
23 {
24  extern std::unique_ptr<BasePluginInterface> create_plugin_instance()
25  {
26  return std::make_unique<GuiExtensionDemoPlugin>();
27  }
28 
30  {
31  m_extensions.push_back(new GuiExtensionContext);
32  }
33 
35  {
36  return std::string("gui_extension_demo");
37  }
38 
40  {
41  return std::string("0.1");
42  }
43 
45  {
46  return std::string("Demo: extension of GUI menu by pluggable python scripts");
47  }
48 
50  {
51  }
52 
53 //----------------------
54 
56 
58  {
59  sInstance = this;
60  }
61 
63  {
64  sInstance = nullptr;
65  }
66 
68  {
69  m_python_plugins.clear();
70  m_module_context_contribution.clear();
71  m_gate_context_contribution.clear();
72  m_net_context_contribution.clear();
73  m_parameter.clear();
74  }
75 
76  std::vector<ContextMenuContribution> GuiExtensionContext::get_context_contribution(const Netlist *nl,
77  const std::vector<u32>& mods,
78  const std::vector<u32>& gats,
79  const std::vector<u32>& nets)
80  {
81  if (!nl)
82  return std::vector<ContextMenuContribution>();
83 
84  if (mods.size() == 1 && gats.empty() && nets.empty() )
85  return m_module_context_contribution;
86 
87  if (mods.empty() && gats.size() == 1 && nets.empty() )
88  return m_gate_context_contribution;
89 
90  if (mods.empty() && gats.empty() && nets.size() == 1 )
91  return m_net_context_contribution;
92 
93  return std::vector<ContextMenuContribution>();
94  }
95 
97  Netlist *nl,
98  const std::vector<u32>& mods,
99  const std::vector<u32>& gats,
100  const std::vector<u32>& nets)
101  {
102  Q_UNUSED(nl);
103 
104  if (tag.empty()) return; // not my call
105 
106  auto it = m_python_plugins.find(tag);
107  if (it == m_python_plugins.end()) return;
108 
109  it->second->set_function_call(tag);
110  it->second->set_selection(mods, gats, nets);
111  }
112 
113  std::vector<PluginParameter> GuiExtensionContext::get_parameter() const
114  {
115  return m_parameter;
116  }
117 
118  void GuiExtensionContext::set_parameter(const std::vector<PluginParameter>& params)
119  {
120  m_parameter = params;
121  }
122 
123  void GuiExtensionContext::add_module_context(GuiExtensionPythonBase* plug, const std::string tagname, const std::string label)
124  {
125  m_module_context_contribution.push_back({this,tagname,label});
126  m_python_plugins.insert(std::make_pair(tagname,plug));
127  }
128 
129  void GuiExtensionContext::add_gate_context(GuiExtensionPythonBase* plug, const std::string tagname, const std::string label)
130  {
131  m_gate_context_contribution.push_back({this,tagname,label});
132  m_python_plugins.insert(std::make_pair(tagname,plug));
133  }
134 
135  void GuiExtensionContext::add_net_context(GuiExtensionPythonBase* plug, const std::string tagname, const std::string label)
136  {
137  m_net_context_contribution.push_back({this,tagname,label});
138  m_python_plugins.insert(std::make_pair(tagname,plug));
139  }
140 
141  void GuiExtensionContext::add_main_menu(GuiExtensionPythonBase* plug, const std::vector<PluginParameter>& params)
142  {
143  for (const PluginParameter& par : params)
144  {
145  m_parameter.push_back(par);
146  if (par.get_type() == PluginParameter::PushButton)
147  m_python_plugins.insert(std::make_pair(par.get_tagname(),plug));
148  }
149  }
150 
151 } // namespace hal
std::vector< AbstractExtensionInterface * > m_extensions
void add_net_context(GuiExtensionPythonBase *plug, const std::string tagname, const std::string label)
void add_gate_context(GuiExtensionPythonBase *plug, const std::string tagname, const std::string label)
std::vector< PluginParameter > get_parameter() const override
static GuiExtensionContext * sInstance
void add_module_context(GuiExtensionPythonBase *plug, const std::string tagname, const std::string label)
void execute_function(std::string tag, Netlist *nl, const std::vector< u32 > &mods, const std::vector< u32 > &gats, const std::vector< u32 > &nets) override
void set_parameter(const std::vector< PluginParameter > &params) override
void add_main_menu(GuiExtensionPythonBase *plug, const std::vector< PluginParameter > &params)
std::vector< ContextMenuContribution > get_context_contribution(const Netlist *nl, const std::vector< u32 > &mods, const std::vector< u32 > &gats, const std::vector< u32 > &nets) override
std::string get_description() const override
std::string get_name() const override
std::string get_version() const override
Definition: defines.h:45
std::unique_ptr< BasePluginInterface > create_plugin_instance()
This file contains various functions to create and load netlists.