15 CfgRegister::CfgRegister()
16 : m_rd_mode(ReadMode::UNSAFE)
25 m_rd_mode = ReadMode::STRICT;
30 m_rd_mode = ReadMode::ECHO;
35 m_rd_mode = ReadMode::CONSTANT;
40 m_queue_rd.push_back(val);
44 {
return m_rd_count; }
46 {
return m_queue_wr.size(); }
48 {
return m_wr_count; }
49 unsigned CfgRegister::write_queue()
const
50 {
return m_queue_wr.size(); }
53 if (m_queue_wr.empty()) {
54 fprintf(stderr,
"Write queue empty.\n");
57 u32 next = m_queue_wr.front();
58 m_queue_wr.pop_front();
65 if (m_rd_mode == ReadMode::UNSAFE) {
67 fprintf(stderr,
"Unsafe register read: %u\n", regaddr);
69 return IoStatus::BUSERROR;
70 }
else if (m_queue_rd.empty()) {
73 if (m_rd_mode == ReadMode::STRICT)
74 fprintf(stderr,
"Unqueued register read: %u\n", regaddr);
79 u32 next = m_queue_rd.front();
80 m_queue_rd.pop_front();
88 if (m_rd_mode == ReadMode::UNSAFE) {
89 fprintf(stderr,
"Unsafe register write: %u\n", regaddr);
90 return IoStatus::BUSERROR;
91 }
else if (m_rd_mode == ReadMode::ECHO) {
94 m_queue_wr.push_back(wrval);
99 for (
unsigned a = 0 ; a < REGS_PER_DEVICE ; ++a)
104 for (
unsigned a = 0 ; a < REGS_PER_DEVICE ; ++a)
109 for (
unsigned a = 0 ; a < REGS_PER_DEVICE ; ++a)
114 regaddr = regaddr % REGS_PER_DEVICE;
115 return reg[regaddr].
read(regaddr, rdval);
119 regaddr = regaddr % REGS_PER_DEVICE;
120 return reg[regaddr].
write(regaddr, wrval);
124 auto& cfg =
get_device(regaddr / REGS_PER_DEVICE);
125 return cfg.read(regaddr % REGS_PER_DEVICE, val);
129 auto& cfg =
get_device(regaddr / REGS_PER_DEVICE);
130 return cfg.write(regaddr % REGS_PER_DEVICE, wrval);
134 m_devs.emplace(devaddr, cfg);
138 auto it = m_devs.find(devaddr);
139 return (it == m_devs.end()) ? m_undef : it->second;
IoStatus
Status codes for ConfigBus read/write operations.
const unsigned REGS_PER_DEVICE
Fixed ConfigBus gateware interface parameters.
Simulated bank of ConfigBus registers.
satcat5::cfg::IoStatus read(unsigned regaddr, u32 &val) override
Basic single-register read operation.
void read_default_none()
Set read mode for all contained registers.
void read_default_echo()
Set read mode for all contained registers.
void read_default(u32 val)
Set read mode for all contained registers.
satcat5::cfg::IoStatus write(unsigned regaddr, u32 wrval) override
Basic single-register write operation.
Simulation of a single ConfigBus register.
void read_default(u32 val)
Set default value for reads when the queue is empty.
unsigned read_count() const
Total reads from this register.
void read_push(u32 val)
Queue up a read for this register.
satcat5::cfg::IoStatus read(unsigned regaddr, u32 &rdval) override
Basic single-register read operation.
u32 write_pop()
Pop one value from the recent write queue.
void read_default_echo()
Set default value for reads when the queue is empty.
satcat5::cfg::IoStatus write(unsigned regaddr, u32 wrval) override
Basic single-register write operation.
void read_default_none()
Set default value for reads when the queue is empty.
unsigned read_queue() const
Number of queued responses.
unsigned write_count() const
Total writes to this register.
Simulated ConfigBus address space with many devices.
satcat5::cfg::IoStatus read(unsigned regaddr, u32 &val) override
Basic single-register read operation.
satcat5::cfg::ConfigBus & get_device(unsigned devaddr)
Access the designated device handler, by device-address.
void add_device(unsigned devaddr, satcat5::cfg::ConfigBus &cfg)
Register a handler for a specific device address.
satcat5::cfg::IoStatus write(unsigned regaddr, u32 wrval) override
Basic single-register write operation.
General-purpose ConfigBus emulator utilities.