SatCat5
sim_cfgbus.h
Go to the documentation of this file.
1 // Copyright 2021-2025 The Aerospace Corporation.
3 // This file is a part of SatCat5, licensed under CERN-OHL-W v2 or later.
15 
16 #pragma once
17 
18 #include <deque>
19 #include <map>
20 #include <satcat5/cfgbus_core.h>
21 
22 namespace satcat5 {
23  namespace test {
31  public:
35  CfgRegister();
36 
45  void read_default_none();
46  void read_default_echo();
47  void read_default(u32 val);
49 
50  // Cumulative read/write statistics.
51  unsigned read_count() const;
52  unsigned write_count() const;
53 
59  void read_push(u32 val);
61  unsigned read_queue() const;
62 
66  u32 write_pop();
68  unsigned write_queue() const;
69 
70  // Basic read and write operations for ConfigBus API.
71  satcat5::cfg::IoStatus read(unsigned regaddr, u32& rdval) override;
72  satcat5::cfg::IoStatus write(unsigned regaddr, u32 wrval) override;
73 
74  protected:
75  // Queue of past write values and future read values.
76  std::deque<u32> m_queue_rd;
77  std::deque<u32> m_queue_wr;
78 
79  // Configure this register's read-response mode.
80  enum class ReadMode {UNSAFE, STRICT, ECHO, CONSTANT};
81  ReadMode m_rd_mode;
82  u32 m_rd_dval;
83 
84  // Count total reads and writes.
85  unsigned m_rd_count;
86  unsigned m_wr_count;
87  };
88 
95  public:
96  // Basic read and write operations for ConfigBus API.
97  satcat5::cfg::IoStatus read(unsigned regaddr, u32& val) override;
98  satcat5::cfg::IoStatus write(unsigned regaddr, u32 wrval) override;
99 
101  satcat5::test::CfgRegister& operator[](unsigned idx) {return reg[idx];}
102 
105 
109  void read_default_none(); // Read when empty = error
110  void read_default_echo(); // Read when empty = last written
111  void read_default(u32 val); // Read when empty = value
113 
114  protected:
115  // Bank of underlying registers.
116  satcat5::test::CfgRegister reg[satcat5::cfg::REGS_PER_DEVICE];
117  };
118 
123  public:
124  // Basic read and write operations for ConfigBus API.
125  satcat5::cfg::IoStatus read(unsigned regaddr, u32& val) override;
126  satcat5::cfg::IoStatus write(unsigned regaddr, u32 wrval) override;
127 
130 
132  void add_device(unsigned devaddr, satcat5::cfg::ConfigBus& cfg);
133 
135  satcat5::cfg::ConfigBus& get_device(unsigned devaddr);
136 
137  protected:
138  // Handler for undefined registers.
140  // Bank of underlying registers.
141  std::map<unsigned, satcat5::cfg::ConfigBus&> m_devs;
142  };
143  }
144 }
ConfigBus core definitions.
IoStatus
Status codes for ConfigBus read/write operations.
Definition: cfgbus_core.h:99
Generic ConfigBus API.
Definition: cfgbus_core.h:124
void irq_poll()
Poll all registered ConfigBus interrupt handlers.
Definition: cfgbus_core.cc:111
Simulated bank of ConfigBus registers.
Definition: sim_cfgbus.h:94
void irq_poll()
Make the "irq_poll" method accessible.
Definition: sim_cfgbus.h:104
satcat5::cfg::IoStatus read(unsigned regaddr, u32 &val) override
Basic single-register read operation.
Definition: sim_cfgbus.cc:113
void read_default_none()
Set read mode for all contained registers.
Definition: sim_cfgbus.cc:98
void read_default_echo()
Set read mode for all contained registers.
Definition: sim_cfgbus.cc:103
void read_default(u32 val)
Set read mode for all contained registers.
Definition: sim_cfgbus.cc:108
satcat5::cfg::IoStatus write(unsigned regaddr, u32 wrval) override
Basic single-register write operation.
Definition: sim_cfgbus.cc:118
satcat5::test::CfgRegister & operator[](unsigned idx)
Accessor for each simulated register.
Definition: sim_cfgbus.h:101
Simulation of a single ConfigBus register.
Definition: sim_cfgbus.h:30
void read_default(u32 val)
Set default value for reads when the queue is empty.
Definition: sim_cfgbus.cc:34
unsigned read_count() const
Total reads from this register.
Definition: sim_cfgbus.cc:43
void read_push(u32 val)
Queue up a read for this register.
Definition: sim_cfgbus.cc:39
CfgRegister()
Constructor for a single register.
Definition: sim_cfgbus.cc:15
satcat5::cfg::IoStatus read(unsigned regaddr, u32 &rdval) override
Basic single-register read operation.
Definition: sim_cfgbus.cc:63
u32 write_pop()
Pop one value from the recent write queue.
Definition: sim_cfgbus.cc:52
void read_default_echo()
Set default value for reads when the queue is empty.
Definition: sim_cfgbus.cc:29
satcat5::cfg::IoStatus write(unsigned regaddr, u32 wrval) override
Basic single-register write operation.
Definition: sim_cfgbus.cc:86
void read_default_none()
Set default value for reads when the queue is empty.
Definition: sim_cfgbus.cc:24
unsigned read_queue() const
Number of queued responses.
Definition: sim_cfgbus.cc:45
unsigned write_count() const
Total writes to this register.
Definition: sim_cfgbus.cc:47
Simulated ConfigBus address space with many devices.
Definition: sim_cfgbus.h:122
satcat5::cfg::IoStatus read(unsigned regaddr, u32 &val) override
Basic single-register read operation.
Definition: sim_cfgbus.cc:123
satcat5::cfg::ConfigBus & get_device(unsigned devaddr)
Access the designated device handler, by device-address.
Definition: sim_cfgbus.cc:137
void add_device(unsigned devaddr, satcat5::cfg::ConfigBus &cfg)
Register a handler for a specific device address.
Definition: sim_cfgbus.cc:133
satcat5::cfg::IoStatus write(unsigned regaddr, u32 wrval) override
Basic single-register write operation.
Definition: sim_cfgbus.cc:128
void irq_poll()
Make the "irq_poll" method accessible.
Definition: sim_cfgbus.h:129