8#ifndef _LIBQBOX_COMPONENTS_RESET_GPIO_INITIATOR_H
9#define _LIBQBOX_COMPONENTS_RESET_GPIO_INITIATOR_H
11#include <ports/qemu-initiator-signal-socket.h>
12#include <ports/qemu-target-signal-socket.h>
14#include <qemu-instance.h>
15#include <module_factory_registery.h>
16#include <ports/multiinitiator-signal-socket.h>
24 bool m_qemu_resetting =
false;
25 bool m_systemc_resetting =
false;
26 sc_core::sc_event m_reset_ev;
32 reset_gpio(
const sc_core::sc_module_name& name, sc_core::sc_object*
o)
38 , m_reset_i(
"_qemu_reset_i")
39 , m_reset_t(
"_qemu_reset_t")
40 , reset_out(
"reset_out")
41 , reset_in(
"reset_in")
44 m_reset_i.bind(m_reset_t);
47 m_reset_t.register_value_changed_cb([&](
bool value) {
48 sc_core::sc_suspendable();
51 if (!m_systemc_resetting && !m_qemu_resetting) {
53 m_qemu_resetting =
true;
56 m_systemc_resetting =
true;
57 reset_out.async_write_vector({ 1, 0 });
63 m_qemu_resetting =
false;
65 while (m_systemc_resetting) {
66 SCP_DEBUG(())(
"Waiting for SystemC to be done resetting");
69 SCP_DEBUG(())(
"Finished waiting for SystemC reset");
74 reset_in.register_value_changed_cb([&](
bool value) {
76 if (!m_systemc_resetting && !m_qemu_resetting) {
78 m_systemc_resetting =
true;
81 m_qemu_resetting =
true;
82 m_inst.
get().system_reset();
85 assert(m_systemc_resetting);
86 SCP_INFO(())(
"SystemC done resetting");
87 m_systemc_resetting =
false;
89 while (m_qemu_resetting) {
90 SCP_DEBUG(())(
"Waiting Qemu to be done resetting");
93 SCP_DEBUG(())(
"Finished waiting for QEMU reset");
98 virtual void end_of_elaboration()
override
100 QemuDevice::end_of_elaboration();
103 virtual void start_of_simulation()
override { m_dev.set_prop_bool(
"active",
true); }
106extern "C" void module_register();
QEMU device abstraction as a SystemC module.
Definition device.h:37
A QEMU output GPIO exposed as a InitiatorSignalSocket<bool>
Definition qemu-initiator-signal-socket.h:40
void init_named(qemu::Device dev, const char *gpio_name, int gpio_idx)
Initialize this socket with a device, a GPIO namespace, and a GPIO index.
Definition qemu-initiator-signal-socket.h:155
This class encapsulates a libqemu-cxx qemu::LibQemu instance. It handles QEMU parameters and instance...
Definition qemu-instance.h:89
qemu::LibQemu & get()
Returns the underlying qemu::LibQemu instance.
Definition qemu-instance.h:448
A QEMU input GPIO exposed as a TargetSignalSocket<bool>
Definition qemu-target-signal-socket.h:29
Definition reset_gpio.h:19