aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClément Zrounba <clement.zrounba@ec-lyon.fr>2023-12-21 13:08:07 +0000
committerClément Zrounba <clement.zrounba@ec-lyon.fr>2023-12-21 13:08:07 +0000
commit0bb001dec03b295713ef9867e1de933136382d2c (patch)
tree59f5df2a50b025d5c50045a82eea060cf6fee9c2
parent0e4b33a965e8eabb687ba07580be749e5f0ffe4c (diff)
downloadspecs-0bb001dec03b295713ef9867e1de933136382d2c.tar.gz
specs-0bb001dec03b295713ef9867e1de933136382d2c.zip
Add source files missing from previous commitdev
-rw-r--r--src/devices/power_meter.cpp36
-rw-r--r--src/devices/power_meter.h36
2 files changed, 72 insertions, 0 deletions
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 <power_meter.h>
+#include <cstdlib> // system()
+#include <random>
+#include <complex>
+
+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 <systemc.h>
+#include <fstream>
+#include <random>
+
+#include <optical_output_port.h>
+#include <optical_signal.h>
+#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<uint32_t,OpticalSignal::field_type> 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;
+ }
+};