// SPDX-License-Identifier: LGPL-3.0-or-other // Copyright (C) 2021 Contributors to the SLS Detector Package #include "sls/ToString.h" #include "sls/network_utils.h" namespace sls { std::string ToString(const slsDetectorDefs::xy &coord) { std::ostringstream oss; oss << '[' << coord.x << ", " << coord.y << ']'; return oss.str(); } std::ostream &operator<<(std::ostream &os, const slsDetectorDefs::xy &coord) { return os << ToString(coord); } std::string ToString(const slsDetectorDefs::ROI &roi) { std::ostringstream oss; oss << '[' << roi.xmin << ", " << roi.xmax << ']'; return oss.str(); } std::ostream &operator<<(std::ostream &os, const slsDetectorDefs::ROI &roi) { return os << ToString(roi); } std::string ToString(const slsDetectorDefs::rxParameters &r) { std::ostringstream oss; oss << '[' << "detType:" << r.detType << std::endl << "numberOfModule.x:" << r.numberOfModule.x << std::endl << "numberOfModule.y:" << r.numberOfModule.y << std::endl << "moduleIndex:" << r.moduleIndex << std::endl << "hostname:" << r.hostname << std::endl << "udpInterfaces:" << r.udpInterfaces << std::endl << "udp_dstport:" << r.udp_dstport << std::endl << "udp_dstip:" << sls::IpAddr(r.udp_dstip) << std::endl << "udp_dstmac:" << sls::MacAddr(r.udp_dstmac) << std::endl << "udp_dstport2:" << r.udp_dstport2 << std::endl << "udp_dstip2:" << sls::IpAddr(r.udp_dstip2) << std::endl << "udp_dstmac2:" << sls::MacAddr(r.udp_dstmac2) << std::endl << "frames:" << r.frames << std::endl << "triggers:" << r.triggers << std::endl << "bursts:" << r.bursts << std::endl << "additionalStorageCells:" << r.additionalStorageCells << std::endl << "analogSamples:" << r.analogSamples << std::endl << "digitalSamples:" << r.digitalSamples << std::endl << "expTime:" << ToString(std::chrono::nanoseconds(r.expTimeNs)) << std::endl << "period:" << ToString(std::chrono::nanoseconds(r.periodNs)) << std::endl << "subExpTime:" << ToString(std::chrono::nanoseconds(r.subExpTimeNs)) << std::endl << "subDeadTime:" << ToString(std::chrono::nanoseconds(r.subDeadTimeNs)) << std::endl << "activate:" << r.activate << std::endl << "leftDataStream:" << r.dataStreamLeft << std::endl << "rightDataStream:" << r.dataStreamRight << std::endl << "quad:" << r.quad << std::endl << "readNRows:" << r.readNRows << std::endl << "thresholdEnergyeV:" << ToString(r.thresholdEnergyeV) << std::endl << "dynamicRange:" << r.dynamicRange << std::endl << "timMode:" << r.timMode << std::endl << "tenGiga:" << r.tenGiga << std::endl << "roMode:" << r.roMode << std::endl << "adcMask:" << r.adcMask << std::endl << "adc10gMask:" << r.adc10gMask << std::endl << "roi.xmin:" << r.roi.xmin << std::endl << "roi.xmax:" << r.roi.xmax << std::endl << "countermask:" << r.countermask << std::endl << "burstType:" << r.burstType << std::endl << "exptime1:" << ToString(std::chrono::nanoseconds(r.expTime1Ns)) << std::endl << "exptime2:" << ToString(std::chrono::nanoseconds(r.expTime2Ns)) << std::endl << "exptime3:" << ToString(std::chrono::nanoseconds(r.expTime3Ns)) << std::endl << "gateDelay1:" << ToString(std::chrono::nanoseconds(r.gateDelay1Ns)) << std::endl << "gateDelay2:" << ToString(std::chrono::nanoseconds(r.gateDelay2Ns)) << std::endl << "gateDelay3:" << ToString(std::chrono::nanoseconds(r.gateDelay3Ns)) << std::endl << "gates:" << r.gates << std::endl << "scanParams:" << sls::ToString(r.scanParams) << std::endl << ']'; return oss.str(); } std::ostream &operator<<(std::ostream &os, const slsDetectorDefs::rxParameters &r) { return os << ToString(r); } std::string ToString(const slsDetectorDefs::scanParameters &r) { std::ostringstream oss; oss << '['; if (r.enable) { oss << "enabled" << std::endl << "dac " << ToString(r.dacInd) << std::endl << "start " << r.startOffset << std::endl << "stop " << r.stopOffset << std::endl << "step " << r.stepSize << std::endl << "settleTime " << ToString(std::chrono::nanoseconds{r.dacSettleTime_ns}) << std::endl; } else { oss << "disabled"; } oss << ']'; return oss.str(); } std::ostream &operator<<(std::ostream &os, const slsDetectorDefs::scanParameters &r) { return os << ToString(r); } std::string ToString(const slsDetectorDefs::currentSrcParameters &r) { std::ostringstream oss; if (r.fix < -1 || r.fix > 1 || r.normal < -1 || r.normal > 1) { throw sls::RuntimeError( "Invalid current source parameters. Cannot print."); } oss << '['; if (r.enable) { oss << "enabled"; // [jungfrau] if (r.fix != -1) { oss << (r.fix == 1 ? ", fix" : ", nofix"); } // [jungfrau chip v1.1] if (r.normal != -1) { oss << ", " << ToStringHex(r.select, 16); oss << (r.normal == 1 ? ", normal" : ", low"); } // [jungfrau chip v1.0] else { oss << ", " << r.select; } } else { oss << "disabled"; } oss << ']'; return oss.str(); } std::ostream &operator<<(std::ostream &os, const slsDetectorDefs::currentSrcParameters &r) { return os << ToString(r); } std::string ToString(const defs::runStatus s) { switch (s) { case defs::ERROR: return std::string("error"); case defs::WAITING: return std::string("waiting"); case defs::RUNNING: return std::string("running"); case defs::TRANSMITTING: return std::string("transmitting"); case defs::RUN_FINISHED: return std::string("finished"); case defs::STOPPED: return std::string("stopped"); default: return std::string("idle"); } } std::string ToString(const defs::detectorType s) { switch (s) { case defs::EIGER: return std::string("Eiger"); case defs::GOTTHARD: return std::string("Gotthard"); case defs::JUNGFRAU: return std::string("Jungfrau"); case defs::CHIPTESTBOARD: return std::string("ChipTestBoard"); case defs::MOENCH: return std::string("Moench"); case defs::MYTHEN3: return std::string("Mythen3"); case defs::GOTTHARD2: return std::string("Gotthard2"); default: return std::string("Unknown"); } } std::string ToString(const defs::detectorSettings s) { switch (s) { case defs::STANDARD: return std::string("standard"); case defs::FAST: return std::string("fast"); case defs::HIGHGAIN: return std::string("highgain"); case defs::DYNAMICGAIN: return std::string("dynamicgain"); case defs::LOWGAIN: return std::string("lowgain"); case defs::MEDIUMGAIN: return std::string("mediumgain"); case defs::VERYHIGHGAIN: return std::string("veryhighgain"); case defs::HIGHGAIN0: return std::string("highgain0"); case defs::FIXGAIN1: return std::string("fixgain1"); case defs::FIXGAIN2: return std::string("fixgain2"); case defs::VERYLOWGAIN: return std::string("verylowgain"); case defs::G1_HIGHGAIN: return std::string("g1_hg"); case defs::G1_LOWGAIN: return std::string("g1_lg"); case defs::G2_HIGHCAP_HIGHGAIN: return std::string("g2_hc_hg"); case defs::G2_HIGHCAP_LOWGAIN: return std::string("g2_hc_lg"); case defs::G2_LOWCAP_HIGHGAIN: return std::string("g2_lc_hg"); case defs::G2_LOWCAP_LOWGAIN: return std::string("g2_lc_lg"); case defs::G4_HIGHGAIN: return std::string("g4_hg"); case defs::G4_LOWGAIN: return std::string("g4_lg"); case defs::GAIN0: return std::string("gain0"); case defs::UNDEFINED: return std::string("undefined"); case defs::UNINITIALIZED: return std::string("uninitialized"); default: return std::string("Unknown"); } } std::string ToString(const defs::speedLevel s) { switch (s) { case defs::FULL_SPEED: return std::string("full_speed"); case defs::HALF_SPEED: return std::string("half_speed"); case defs::QUARTER_SPEED: return std::string("quarter_speed"); case defs::G2_108MHZ: return std::string("108"); case defs::G2_144MHZ: return std::string("144"); default: return std::string("Unknown"); } } std::string ToString(const defs::timingMode s) { switch (s) { case defs::AUTO_TIMING: return std::string("auto"); case defs::TRIGGER_EXPOSURE: return std::string("trigger"); case defs::GATED: return std::string("gating"); case defs::BURST_TRIGGER: return std::string("burst_trigger"); case defs::TRIGGER_GATED: return std::string("trigger_gating"); default: return std::string("Unknown"); } } std::string ToString(const defs::frameDiscardPolicy s) { switch (s) { case defs::NO_DISCARD: return std::string("nodiscard"); case defs::DISCARD_EMPTY_FRAMES: return std::string("discardempty"); case defs::DISCARD_PARTIAL_FRAMES: return std::string("discardpartial"); default: return std::string("Unknown"); } } std::string ToString(const defs::fileFormat s) { switch (s) { case defs::HDF5: return std::string("hdf5"); case defs::BINARY: return std::string("binary"); default: return std::string("Unknown"); } } std::string ToString(const defs::externalSignalFlag s) { switch (s) { case defs::TRIGGER_IN_RISING_EDGE: return std::string("trigger_in_rising_edge"); case defs::TRIGGER_IN_FALLING_EDGE: return std::string("trigger_in_falling_edge"); case defs::INVERSION_ON: return std::string("inversion_on"); case defs::INVERSION_OFF: return std::string("inversion_off"); default: return std::string("Unknown"); } } std::string ToString(const defs::readoutMode s) { switch (s) { case defs::ANALOG_ONLY: return std::string("analog"); case defs::DIGITAL_ONLY: return std::string("digital"); case defs::ANALOG_AND_DIGITAL: return std::string("analog_digital"); default: return std::string("Unknown"); } } std::string ToString(const defs::dacIndex s) { switch (s) { case defs::DAC_0: return std::string("dac 0"); case defs::DAC_1: return std::string("dac 1"); case defs::DAC_2: return std::string("dac 2"); case defs::DAC_3: return std::string("dac 3"); case defs::DAC_4: return std::string("dac 4"); case defs::DAC_5: return std::string("dac 5"); case defs::DAC_6: return std::string("dac 6"); case defs::DAC_7: return std::string("dac 7"); case defs::DAC_8: return std::string("dac 8"); case defs::DAC_9: return std::string("dac 9"); case defs::DAC_10: return std::string("dac 10"); case defs::DAC_11: return std::string("dac 11"); case defs::DAC_12: return std::string("dac 12"); case defs::DAC_13: return std::string("dac 13"); case defs::DAC_14: return std::string("dac 14"); case defs::DAC_15: return std::string("dac 15"); case defs::DAC_16: return std::string("dac 16"); case defs::DAC_17: return std::string("dac 17"); case defs::VSVP: return std::string("vsvp"); case defs::VTRIM: return std::string("vtrim"); case defs::VRPREAMP: return std::string("vrpreamp"); case defs::VRSHAPER: return std::string("vrshaper"); case defs::VSVN: return std::string("vsvn"); case defs::VTGSTV: return std::string("vtgstv"); case defs::VCMP_LL: return std::string("vcmp_ll"); case defs::VCMP_LR: return std::string("vcmp_lr"); case defs::VCAL: return std::string("vcal"); case defs::VCMP_RL: return std::string("vcmp_rl"); case defs::RXB_RB: return std::string("rxb_rb"); case defs::RXB_LB: return std::string("rxb_lb"); case defs::VCMP_RR: return std::string("vcmp_rr"); case defs::VCP: return std::string("vcp"); case defs::VCN: return std::string("vcn"); case defs::VISHAPER: return std::string("vishaper"); case defs::VTHRESHOLD: return std::string("vthreshold"); case defs::VREF_DS: return std::string("vref_ds"); case defs::VCASCN_PB: return std::string("vcascn_pb"); case defs::VCASCP_PB: return std::string("vcascp_pb"); case defs::VOUT_CM: return std::string("vout_cm"); case defs::VCASC_OUT: return std::string("vcasc_out"); case defs::VIN_CM: return std::string("vin_cm"); case defs::VREF_COMP: return std::string("vref_comp"); case defs::IB_TESTC: return std::string("ib_test_c"); case defs::VB_COMP: return std::string("vb_comp"); case defs::VDD_PROT: return std::string("vdd_prot"); case defs::VIN_COM: return std::string("vin_com"); case defs::VREF_PRECH: return std::string("vref_prech"); case defs::VB_PIXBUF: return std::string("vb_pixbuf"); case defs::VB_DS: return std::string("vb_ds"); case defs::VREF_H_ADC: return std::string("vref_h_adc"); case defs::VB_COMP_FE: return std::string("vb_comp_fe"); case defs::VB_COMP_ADC: return std::string("vb_comp_adc"); case defs::VCOM_CDS: return std::string("vcom_cds"); case defs::VREF_RSTORE: return std::string("vref_rstore"); case defs::VB_OPA_1ST: return std::string("vb_opa_1st"); case defs::VREF_COMP_FE: return std::string("vref_comp_fe"); case defs::VCOM_ADC1: return std::string("vcom_adc1"); case defs::VREF_L_ADC: return std::string("vref_l_adc"); case defs::VREF_CDS: return std::string("vref_cds"); case defs::VB_CS: return std::string("vb_cs"); case defs::VB_OPA_FD: return std::string("vb_opa_fd"); case defs::VCOM_ADC2: return std::string("vcom_adc2"); case defs::VCASSH: return std::string("vcassh"); case defs::VTH2: return std::string("vth2"); case defs::VRSHAPER_N: return std::string("vrshaper_n"); case defs::VIPRE_OUT: return std::string("vipre_out"); case defs::VTH3: return std::string("vth3"); case defs::VTH1: return std::string("vth1"); case defs::VICIN: return std::string("vicin"); case defs::VCAS: return std::string("vcas"); case defs::VCAL_N: return std::string("vcal_n"); case defs::VIPRE: return std::string("vipre"); case defs::VCAL_P: return std::string("vcal_p"); case defs::VDCSH: return std::string("vdcsh"); case defs::VBP_COLBUF: return std::string("vbp_colbuf"); case defs::VB_SDA: return std::string("vb_sda"); case defs::VCASC_SFP: return std::string("vcasc_sfp"); case defs::VIPRE_CDS: return std::string("vipre_cds"); case defs::IBIAS_SFP: return std::string("ibias_sfp"); case defs::ADC_VPP: return std::string("adcvpp"); case defs::TRIMBIT_SCAN: return std::string("trimbits"); case defs::HIGH_VOLTAGE: return std::string("highvoltage"); case defs::IO_DELAY: return std::string("iodelay"); case defs::TEMPERATURE_ADC: return std::string("temp_adc"); case defs::TEMPERATURE_FPGA: return std::string("temp_fpga"); case defs::TEMPERATURE_FPGAEXT: return std::string("temp_fpgaext"); case defs::TEMPERATURE_10GE: return std::string("temp_10ge"); case defs::TEMPERATURE_DCDC: return std::string("temp_dcdc"); case defs::TEMPERATURE_SODL: return std::string("temp_sodl"); case defs::TEMPERATURE_SODR: return std::string("temp_sodr"); case defs::TEMPERATURE_FPGA2: return std::string("temp_fpgafl"); case defs::TEMPERATURE_FPGA3: return std::string("temp_fpgafr"); case defs::SLOW_ADC_TEMP: return std::string("temp_slowadc"); default: return std::string("Unknown"); } } std::string ToString(const std::vector &vec) { std::ostringstream os; os << '['; if (!vec.empty()) { auto it = vec.begin(); os << ToString(*it++); while (it != vec.end()) os << ", " << ToString(*it++); } os << ']'; return os.str(); } std::string ToString(const defs::burstMode s) { switch (s) { case defs::BURST_INTERNAL: return std::string("burst_internal"); case defs::BURST_EXTERNAL: return std::string("burst_external"); case defs::CONTINUOUS_INTERNAL: return std::string("cw_internal"); case defs::CONTINUOUS_EXTERNAL: return std::string("cw_external"); default: return std::string("Unknown"); } } std::string ToString(const defs::timingSourceType s) { switch (s) { case defs::TIMING_INTERNAL: return std::string("internal"); case defs::TIMING_EXTERNAL: return std::string("external"); default: return std::string("Unknown"); } } std::string ToString(defs::M3_GainCaps s) { std::ostringstream os; if (s & defs::M3_C10pre) os << "C10pre, "; if (s & defs::M3_C15sh) os << "C15sh, "; if (s & defs::M3_C30sh) os << "C30sh, "; if (s & defs::M3_C50sh) os << "C50sh, "; if (s & defs::M3_C225ACsh) os << "C225ACsh, "; if (s & defs::M3_C15pre) os << "C15pre, "; auto rs = os.str(); rs.erase(rs.end() - 2); return rs; } std::string ToString(const defs::portPosition s) { switch (s) { case defs::LEFT: return std::string("left"); case defs::RIGHT: return std::string("right"); case defs::TOP: return std::string("top"); case defs::BOTTOM: return std::string("bottom"); default: return std::string("Unknown"); } } std::string ToString(const defs::streamingInterface s) { std::ostringstream os; std::string rs; switch (s) { case defs::streamingInterface::NONE: return std::string("none"); default: if ((s & defs::streamingInterface::LOW_LATENCY_LINK) != defs::streamingInterface::NONE) os << "lll, "; if ((s & defs::streamingInterface::ETHERNET_10GB) != defs::streamingInterface::NONE) os << "10gbe, "; auto rs = os.str(); rs.erase(rs.end() - 2, rs.end()); return rs; } } std::string ToString(const defs::vetoAlgorithm s) { switch (s) { case defs::ALG_HITS: return std::string("hits"); case defs::ALG_RAW: return std::string("raw"); default: return std::string("Unknown"); } } std::string ToString(const defs::gainMode s) { switch (s) { case defs::DYNAMIC: return std::string("dynamic"); case defs::FORCE_SWITCH_G1: return std::string("forceswitchg1"); case defs::FORCE_SWITCH_G2: return std::string("forceswitchg2"); case defs::FIX_G1: return std::string("fixg1"); case defs::FIX_G2: return std::string("fixg2"); case defs::FIX_G0: return std::string("fixg0"); default: return std::string("Unknown"); } } const std::string &ToString(const std::string &s) { return s; } template <> defs::detectorType StringTo(const std::string &s) { if (s == "Eiger") return defs::EIGER; if (s == "Gotthard") return defs::GOTTHARD; if (s == "Jungfrau") return defs::JUNGFRAU; if (s == "ChipTestBoard") return defs::CHIPTESTBOARD; if (s == "Moench") return defs::MOENCH; if (s == "Mythen3") return defs::MYTHEN3; if (s == "Gotthard2") return defs::GOTTHARD2; throw sls::RuntimeError("Unknown detector type " + s); } template <> defs::detectorSettings StringTo(const std::string &s) { if (s == "standard") return defs::STANDARD; if (s == "fast") return defs::FAST; if (s == "highgain") return defs::HIGHGAIN; if (s == "dynamicgain") return defs::DYNAMICGAIN; if (s == "lowgain") return defs::LOWGAIN; if (s == "mediumgain") return defs::MEDIUMGAIN; if (s == "veryhighgain") return defs::VERYHIGHGAIN; if (s == "highgain0") return defs::HIGHGAIN0; if (s == "fixgain1") return defs::FIXGAIN1; if (s == "fixgain2") return defs::FIXGAIN2; if (s == "verylowgain") return defs::VERYLOWGAIN; if (s == "g1_hg") return defs::G1_HIGHGAIN; if (s == "g1_lg") return defs::G1_LOWGAIN; if (s == "g2_hc_hg") return defs::G2_HIGHCAP_HIGHGAIN; if (s == "g2_hc_lg") return defs::G2_HIGHCAP_LOWGAIN; if (s == "g2_lc_hg") return defs::G2_LOWCAP_HIGHGAIN; if (s == "g2_lc_lg") return defs::G2_LOWCAP_LOWGAIN; if (s == "g4_hg") return defs::G4_HIGHGAIN; if (s == "gain0") return defs::GAIN0; if (s == "g4_lg") return defs::G4_LOWGAIN; throw sls::RuntimeError("Unknown setting " + s); } template <> defs::speedLevel StringTo(const std::string &s) { if (s == "full_speed") return defs::FULL_SPEED; if (s == "0") return defs::FULL_SPEED; if (s == "half_speed") return defs::HALF_SPEED; if (s == "1") return defs::HALF_SPEED; if (s == "quarter_speed") return defs::QUARTER_SPEED; if (s == "2") return defs::QUARTER_SPEED; if (s == "108") return defs::G2_108MHZ; if (s == "144") return defs::G2_144MHZ; throw sls::RuntimeError("Unknown speed " + s); } template <> defs::timingMode StringTo(const std::string &s) { if (s == "auto") return defs::AUTO_TIMING; if (s == "trigger") return defs::TRIGGER_EXPOSURE; if (s == "gating") return defs::GATED; if (s == "burst_trigger") return defs::BURST_TRIGGER; if (s == "trigger_gating") return defs::TRIGGER_GATED; throw sls::RuntimeError("Unknown timing mode " + s); } template <> defs::frameDiscardPolicy StringTo(const std::string &s) { if (s == "nodiscard") return defs::NO_DISCARD; if (s == "discardempty") return defs::DISCARD_EMPTY_FRAMES; if (s == "discardpartial") return defs::DISCARD_PARTIAL_FRAMES; throw sls::RuntimeError("Unknown frame discard policy " + s); } template <> defs::fileFormat StringTo(const std::string &s) { if (s == "hdf5") return defs::HDF5; if (s == "binary") return defs::BINARY; throw sls::RuntimeError("Unknown file format " + s); } template <> defs::externalSignalFlag StringTo(const std::string &s) { if (s == "trigger_in_rising_edge") return defs::TRIGGER_IN_RISING_EDGE; if (s == "trigger_in_falling_edge") return defs::TRIGGER_IN_FALLING_EDGE; if (s == "inversion_on") return defs::INVERSION_ON; if (s == "inversion_off") return defs::INVERSION_OFF; throw sls::RuntimeError("Unknown external signal flag " + s); } template <> defs::readoutMode StringTo(const std::string &s) { if (s == "analog") return defs::ANALOG_ONLY; if (s == "digital") return defs::DIGITAL_ONLY; if (s == "analog_digital") return defs::ANALOG_AND_DIGITAL; throw sls::RuntimeError("Unknown readout mode " + s); } template <> defs::dacIndex StringTo(const std::string &s) { if (s == "dac 0" || s == "0") return defs::DAC_0; if (s == "dac 1" || s == "1") return defs::DAC_1; if (s == "dac 2" || s == "2") return defs::DAC_2; if (s == "dac 3" || s == "3") return defs::DAC_3; if (s == "dac 4" || s == "4") return defs::DAC_4; if (s == "dac 5" || s == "5") return defs::DAC_5; if (s == "dac 6" || s == "6") return defs::DAC_6; if (s == "dac 7" || s == "7") return defs::DAC_7; if (s == "dac 8" || s == "8") return defs::DAC_8; if (s == "dac 9" || s == "9") return defs::DAC_9; if (s == "dac 10" || s == "10") return defs::DAC_10; if (s == "dac 11" || s == "11") return defs::DAC_11; if (s == "dac 12" || s == "12") return defs::DAC_12; if (s == "dac 13" || s == "13") return defs::DAC_13; if (s == "dac 14" || s == "14") return defs::DAC_14; if (s == "dac 15" || s == "15") return defs::DAC_15; if (s == "dac 16" || s == "16") return defs::DAC_16; if (s == "dac 17" || s == "17") return defs::DAC_17; if (s == "vsvp") return defs::VSVP; if (s == "vtrim") return defs::VTRIM; if (s == "vrpreamp") return defs::VRPREAMP; if (s == "vrshaper") return defs::VRSHAPER; if (s == "vsvn") return defs::VSVN; if (s == "vtgstv") return defs::VTGSTV; if (s == "vcmp_ll") return defs::VCMP_LL; if (s == "vcmp_lr") return defs::VCMP_LR; if (s == "vcal") return defs::VCAL; if (s == "vcmp_rl") return defs::VCMP_RL; if (s == "rxb_rb") return defs::RXB_RB; if (s == "rxb_lb") return defs::RXB_LB; if (s == "vcmp_rr") return defs::VCMP_RR; if (s == "vcp") return defs::VCP; if (s == "vcn") return defs::VCN; if (s == "vishaper") return defs::VISHAPER; if (s == "vthreshold") return defs::VTHRESHOLD; if (s == "vref_ds") return defs::VREF_DS; if (s == "vcascn_pb") return defs::VCASCN_PB; if (s == "vcascp_pb") return defs::VCASCP_PB; if (s == "vout_cm") return defs::VOUT_CM; if (s == "vcasc_out") return defs::VCASC_OUT; if (s == "vin_cm") return defs::VIN_CM; if (s == "vref_comp") return defs::VREF_COMP; if (s == "ib_test_c") return defs::IB_TESTC; if (s == "vb_comp") return defs::VB_COMP; if (s == "vdd_prot") return defs::VDD_PROT; if (s == "vin_com") return defs::VIN_COM; if (s == "vref_prech") return defs::VREF_PRECH; if (s == "vb_pixbuf") return defs::VB_PIXBUF; if (s == "vb_ds") return defs::VB_DS; if (s == "vref_h_adc") return defs::VREF_H_ADC; if (s == "vb_comp_fe") return defs::VB_COMP_FE; if (s == "vb_comp_adc") return defs::VB_COMP_ADC; if (s == "vcom_cds") return defs::VCOM_CDS; if (s == "vref_rstore") return defs::VREF_RSTORE; if (s == "vb_opa_1st") return defs::VB_OPA_1ST; if (s == "vref_comp_fe") return defs::VREF_COMP_FE; if (s == "vcom_adc1") return defs::VCOM_ADC1; if (s == "vref_l_adc") return defs::VREF_L_ADC; if (s == "vref_cds") return defs::VREF_CDS; if (s == "vb_cs") return defs::VB_CS; if (s == "vb_opa_fd") return defs::VB_OPA_FD; if (s == "vcom_adc2") return defs::VCOM_ADC2; if (s == "vcassh") return defs::VCASSH; if (s == "vth2") return defs::VTH2; if (s == "vrshaper_n") return defs::VRSHAPER_N; if (s == "vipre_out") return defs::VIPRE_OUT; if (s == "vth3") return defs::VTH3; if (s == "vth1") return defs::VTH1; if (s == "vicin") return defs::VICIN; if (s == "vcas") return defs::VCAS; if (s == "vcal_n") return defs::VCAL_N; if (s == "vipre") return defs::VIPRE; if (s == "vcal_p") return defs::VCAL_P; if (s == "vdcsh") return defs::VDCSH; if (s == "vbp_colbuf") return defs::VBP_COLBUF; if (s == "vb_sda") return defs::VB_SDA; if (s == "vcasc_sfp") return defs::VCASC_SFP; if (s == "vipre_cds") return defs::VIPRE_CDS; if (s == "ibias_sfp") return defs::IBIAS_SFP; if (s == "adcvpp") return defs::ADC_VPP; if (s == "trimbits") return defs::TRIMBIT_SCAN; if (s == "highvoltage") return defs::HIGH_VOLTAGE; if (s == "iodelay") return defs::IO_DELAY; if (s == "temp_adc") return defs::TEMPERATURE_ADC; if (s == "temp_fpga") return defs::TEMPERATURE_FPGA; if (s == "temp_fpgaext") return defs::TEMPERATURE_FPGAEXT; if (s == "temp_10ge") return defs::TEMPERATURE_10GE; if (s == "temp_dcdc") return defs::TEMPERATURE_DCDC; if (s == "temp_sodl") return defs::TEMPERATURE_SODL; if (s == "temp_sodr") return defs::TEMPERATURE_SODR; if (s == "temp_fpgafl") return defs::TEMPERATURE_FPGA2; if (s == "temp_fpgafr") return defs::TEMPERATURE_FPGA3; if (s == "temp_slowadc") return defs::SLOW_ADC_TEMP; throw sls::RuntimeError("Unknown dac Index " + s); } template <> defs::burstMode StringTo(const std::string &s) { if (s == "burst_internal") return defs::BURST_INTERNAL; if (s == "burst_external") return defs::BURST_EXTERNAL; if (s == "cw_internal") return defs::CONTINUOUS_INTERNAL; if (s == "cw_external") return defs::CONTINUOUS_EXTERNAL; throw sls::RuntimeError("Unknown burst mode " + s); } template <> defs::timingSourceType StringTo(const std::string &s) { if (s == "internal") return defs::TIMING_INTERNAL; if (s == "external") return defs::TIMING_EXTERNAL; throw sls::RuntimeError("Unknown timing source type " + s); } template <> defs::M3_GainCaps StringTo(const std::string &s) { if (s == "C10pre") return defs::M3_C10pre; if (s == "C15sh") return defs::M3_C15sh; if (s == "C30sh") return defs::M3_C30sh; if (s == "C50sh") return defs::M3_C50sh; if (s == "C225ACsh") return defs::M3_C225ACsh; if (s == "C15pre") return defs::M3_C15pre; throw sls::RuntimeError("Unknown gain cap " + s); } template <> defs::portPosition StringTo(const std::string &s) { if (s == "left") return defs::LEFT; if (s == "right") return defs::RIGHT; if (s == "top") return defs::TOP; if (s == "bottom") return defs::BOTTOM; throw sls::RuntimeError("Unknown port position " + s); } template <> defs::streamingInterface StringTo(const std::string &s) { std::string rs = s; if (s.find(',') != std::string::npos) rs.erase(rs.find(',')); if (rs == "none") return defs::streamingInterface::NONE; if (rs == "lll") return defs::streamingInterface::LOW_LATENCY_LINK; if (rs == "10gbe") return defs::streamingInterface::ETHERNET_10GB; throw sls::RuntimeError("Unknown streamingInterface type " + s); } template <> defs::vetoAlgorithm StringTo(const std::string &s) { if (s == "hits") return defs::ALG_HITS; if (s == "raw") return defs::ALG_RAW; throw sls::RuntimeError("Unknown veto algorithm " + s); } template <> defs::gainMode StringTo(const std::string &s) { if (s == "dynamic") return defs::DYNAMIC; if (s == "forceswitchg1") return defs::FORCE_SWITCH_G1; if (s == "forceswitchg2") return defs::FORCE_SWITCH_G2; if (s == "fixg1") return defs::FIX_G1; if (s == "fixg2") return defs::FIX_G2; if (s == "fixg0") return defs::FIX_G0; throw sls::RuntimeError("Unknown gain mode " + s); } template <> uint32_t StringTo(const std::string &s) { int base = s.find("0x") != std::string::npos ? 16 : 10; return std::stoul(s, nullptr, base); } template <> uint64_t StringTo(const std::string &s) { int base = s.find("0x") != std::string::npos ? 16 : 10; return std::stoull(s, nullptr, base); } template <> int StringTo(const std::string &s) { int base = s.find("0x") != std::string::npos ? 16 : 10; return std::stoi(s, nullptr, base); } template <> bool StringTo(const std::string &s) { int i = std::stoi(s, nullptr, 10); switch (i) { case 0: return false; case 1: return true; default: throw sls::RuntimeError("Unknown boolean. Expecting be 0 or 1."); } } template <> int64_t StringTo(const std::string &s) { int base = s.find("0x") != std::string::npos ? 16 : 10; return std::stol(s, nullptr, base); } } // namespace sls