HAL
gate_type_component.cpp
Go to the documentation of this file.
2 
11 
12 namespace hal
13 {
14  template<>
15  std::map<GateTypeComponent::ComponentType, std::string> EnumStrings<GateTypeComponent::ComponentType>::data = {{GateTypeComponent::ComponentType::lut, "lut"},
23 
24  std::unique_ptr<GateTypeComponent> GateTypeComponent::create_lut_component(std::unique_ptr<GateTypeComponent> component, bool init_ascending)
25  {
26  if (component == nullptr)
27  {
28  return nullptr;
29  }
30 
31  return std::make_unique<LUTComponent>(std::move(component), init_ascending);
32  }
33 
34  std::unique_ptr<GateTypeComponent> GateTypeComponent::create_ff_component(std::unique_ptr<GateTypeComponent> component, const BooleanFunction& next_state_bf, const BooleanFunction& clock_bf)
35  {
36  return std::make_unique<FFComponent>(std::move(component), next_state_bf.clone(), clock_bf.clone());
37  }
38 
39  std::unique_ptr<GateTypeComponent> GateTypeComponent::create_latch_component(std::unique_ptr<GateTypeComponent> component)
40  {
41  return std::make_unique<LatchComponent>(std::move(component));
42  }
43 
44  std::unique_ptr<GateTypeComponent> GateTypeComponent::create_ram_component(std::unique_ptr<GateTypeComponent> component, const u32 bit_size)
45  {
46  if (component == nullptr)
47  {
48  return nullptr;
49  }
50 
51  return std::make_unique<RAMComponent>(std::move(component), bit_size);
52  }
53 
54  std::unique_ptr<GateTypeComponent> GateTypeComponent::create_mac_component()
55  {
56  // TODO do fancy MAC stuff
57  return std::make_unique<MACComponent>();
58  }
59 
60  std::unique_ptr<GateTypeComponent> GateTypeComponent::create_init_component(const std::string& init_category, const std::vector<std::string>& init_identifiers)
61  {
62  return std::make_unique<InitComponent>(init_category, init_identifiers);
63  }
64 
65  std::unique_ptr<GateTypeComponent>
66  GateTypeComponent::create_state_component(std::unique_ptr<GateTypeComponent> component, const std::string& state_identifier, const std::string& neg_state_identifier)
67  {
68  return std::make_unique<StateComponent>(std::move(component), state_identifier, neg_state_identifier);
69  }
70 
71  std::unique_ptr<GateTypeComponent> GateTypeComponent::create_ram_port_component(std::unique_ptr<GateTypeComponent> component,
72  const std::string& data_group,
73  const std::string& addr_group,
74  const BooleanFunction& clock_bf,
75  const BooleanFunction& enable_bf,
76  bool is_write)
77  {
78  return std::make_unique<RAMPortComponent>(std::move(component), data_group, addr_group, clock_bf.clone(), enable_bf.clone(), is_write);
79  }
80 
81  GateTypeComponent* GateTypeComponent::get_component(const std::function<bool(const GateTypeComponent*)>& filter) const
82  {
83  std::vector<GateTypeComponent*> components = this->get_components(filter);
84 
85  if (components.size() == 1)
86  {
87  return *components.begin();
88  }
89 
90  return nullptr;
91  }
92 } // namespace hal
BooleanFunction clone() const
virtual std::vector< GateTypeComponent * > get_components(const std::function< bool(const GateTypeComponent *)> &filter=nullptr) const =0
static std::unique_ptr< GateTypeComponent > create_state_component(std::unique_ptr< GateTypeComponent > component, const std::string &state_identifier, const std::string &neg_state_identifier)
static std::unique_ptr< GateTypeComponent > create_lut_component(std::unique_ptr< GateTypeComponent > component, bool init_ascending)
static std::unique_ptr< GateTypeComponent > create_init_component(const std::string &init_category, const std::vector< std::string > &init_identifiers)
static std::unique_ptr< GateTypeComponent > create_latch_component(std::unique_ptr< GateTypeComponent > component)
static std::unique_ptr< GateTypeComponent > create_ram_component(std::unique_ptr< GateTypeComponent > component, const u32 bit_size)
static std::unique_ptr< GateTypeComponent > create_ff_component(std::unique_ptr< GateTypeComponent > component, const BooleanFunction &next_state_bf, const BooleanFunction &clock_bf)
static std::unique_ptr< GateTypeComponent > create_ram_port_component(std::unique_ptr< GateTypeComponent > component, const std::string &data_group, const std::string &addr_group, const BooleanFunction &clock_bf, const BooleanFunction &enable_bf, bool is_write)
GateTypeComponent * get_component(const std::function< bool(const GateTypeComponent *)> &filter=nullptr) const
static std::unique_ptr< GateTypeComponent > create_mac_component()
quint32 u32