From 0bb001dec03b295713ef9867e1de933136382d2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Zrounba?= Date: Thu, 21 Dec 2023 13:08:07 +0000 Subject: Add source files missing from previous commit --- src/devices/power_meter.cpp | 36 ++++++++++++++++++++++++++++++++++++ src/devices/power_meter.h | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 src/devices/power_meter.cpp create mode 100644 src/devices/power_meter.h (limited to 'src/devices') diff --git a/src/devices/power_meter.cpp b/src/devices/power_meter.cpp new file mode 100644 index 0000000..ad3976d --- /dev/null +++ b/src/devices/power_meter.cpp @@ -0,0 +1,36 @@ +#include "specs.h" +#include +#include // system() +#include +#include + +using namespace std; + +void PowerMeter::trace(sc_trace_file *Tf) const +{ + sc_trace(Tf, m_cur_power, (string(name()) + ".power").c_str()); +} + +void PowerMeter::on_port_in_changed() +{ + // always initialize memory + m_memory_in[0] = 0; + + while (true) { + // Wait for a new input signal + wait(); + + const auto &p_in_read = p_in->read(); + + auto cur_wavelength_id = p_in_read.m_wavelength_id; + // Updating the field memory + m_memory_in[cur_wavelength_id] = p_in_read.m_field; + + double total_power = 0; + for (auto field : m_memory_in) + { + total_power += norm(field.second); + } + m_cur_power = total_power; + } +} diff --git a/src/devices/power_meter.h b/src/devices/power_meter.h new file mode 100644 index 0000000..73339f3 --- /dev/null +++ b/src/devices/power_meter.h @@ -0,0 +1,36 @@ +#pragma once + +#include +#include +#include + +#include +#include +#include "specs.h" +#include "spx_module.h" + +/* Power meter (DC component only) */ +class PowerMeter : public spx_module { +public: + // Ports + spx::oa_port_in_type p_in; + double m_cur_power; + + // Input memory for multi-wavelength purposes + std::map m_memory_in; + + // Processes + void on_port_in_changed(); + + virtual void trace(sc_trace_file *Tf) const; + + // Constructor + PowerMeter(sc_module_name name) + : spx_module(name) + { + SC_HAS_PROCESS(PowerMeter); + + SC_THREAD(on_port_in_changed); + sensitive << p_in; + } +}; -- cgit v1.2.3