aboutsummaryrefslogtreecommitdiff
path: root/src/devices/octane_cell.cpp
diff options
context:
space:
mode:
authorClément Zrounba <6691770+clement-z@users.noreply.github.com>2023-09-30 23:06:01 +0200
committerClément Zrounba <6691770+clement-z@users.noreply.github.com>2023-09-30 23:26:46 +0200
commitff9b8bb838ecdfbfc1dc81038fcf3b2a87636982 (patch)
tree21f27be782ce11c6d00b96ce100a2bff88141b2e /src/devices/octane_cell.cpp
downloadspecs-ff9b8bb838ecdfbfc1dc81038fcf3b2a87636982.tar.gz
specs-ff9b8bb838ecdfbfc1dc81038fcf3b2a87636982.zip
Initial release
Diffstat (limited to 'src/devices/octane_cell.cpp')
-rw-r--r--src/devices/octane_cell.cpp91
1 files changed, 91 insertions, 0 deletions
diff --git a/src/devices/octane_cell.cpp b/src/devices/octane_cell.cpp
new file mode 100644
index 0000000..1b5c59c
--- /dev/null
+++ b/src/devices/octane_cell.cpp
@@ -0,0 +1,91 @@
+#include <octane_cell.h>
+
+#define __modname(SUFFIX, IDX) \
+ ((""s + this->name() + "_" + SUFFIX + to_string(IDX)).c_str())
+
+void OctaneCell::init()
+{
+ if(m_isCompact)
+ init_compact();
+ else
+ init_full();
+}
+
+void OctaneCell::init_full()
+{
+ // Physical parameters of the components
+ double lambda = 1550e-9; // the wavelength used by the circuit
+ double neff = 2.2;
+ double ng = 2.2;
+ double loss_per_cm = 0; // in waveguide
+ double loss_merger = 0;
+ double length_for_2pi = 100*lambda/(neff);
+
+ // Constructing the instances
+ m_wg1 = make_unique<Waveguide>(__modname("WG_", 0), length_for_2pi, loss_per_cm, neff, ng);
+ m_wg2 = make_unique<Waveguide>(__modname("WG_", 1), length_for_2pi, loss_per_cm, neff, ng);
+ m_wg3 = make_unique<Waveguide>(__modname("WG_", 2), length_for_2pi, loss_per_cm, neff, ng);
+ m_wg4 = make_unique<Waveguide>(__modname("WG_", 3), length_for_2pi, loss_per_cm, neff, ng);
+
+ m_merger = make_unique<Merger>(__modname("Y_", 0), loss_merger);
+
+ m_pcm = make_unique<PCMElement>(__modname("PCM_", 0), m_meltEnergy, m_nStates, 0);
+
+ m_pd = make_unique<Detector>(__modname("PD_", 0));
+
+ // Connecting
+ m_wg1->p_in(p_in_r);
+ m_wg1->p_out(m_merg_in1);
+
+ m_wg2->p_in(p_in_c);
+ m_wg2->p_out(m_merg_in2);
+
+ m_merger->p_in1(m_merg_in1);
+ m_merger->p_in2(m_merg_in2);
+ m_merger->p_out(m_merg_out);
+
+ m_wg3->p_in(m_merg_out);
+ m_wg3->p_out(m_pcm_in);
+
+ m_pcm->p_in(m_pcm_in);
+ m_pcm->p_out(m_pcm_out);
+
+ // m_wg4->p_in(m_pcm_in);
+ m_wg4->p_in(m_pcm_out);
+ m_wg4->p_out(m_pd_in);
+
+ m_pd->p_in(m_pd_in);
+ m_pd->p_readout(p_readout);
+}
+
+void OctaneCell::init_compact()
+{
+ // Physical parameters of the components
+ double lambda = 1550e-9; // the wavelength used by the circuit
+ double neff = 2.2;
+ double ng = 2.2;
+ double loss_per_cm = 0; // in waveguide
+ double loss_merger = 0;
+ double length_for_2pi = 100*lambda/(neff);
+
+ (void)ng;
+ (void)loss_per_cm;
+ (void)length_for_2pi;
+
+ m_merger = make_unique<Merger>(__modname("Y_", 0), loss_merger);
+
+ m_pcm = make_unique<PCMElement>(__modname("PCM_", 0), m_meltEnergy, m_nStates, 0);
+
+ m_pd = make_unique<Detector>(__modname("PD_", 0));
+
+ // Connecting
+ m_merger->p_in1(p_in_r);
+ m_merger->p_in2(p_in_c);
+ m_merger->p_out(m_merg_out);
+
+ m_pcm->p_in(m_merg_out);
+ m_pcm->p_out(m_pcm_out);
+
+ m_pd->p_in(m_pcm_out);
+ m_pd->p_readout(p_readout);
+} \ No newline at end of file