diff --git a/evrMrmApp/Db/Makefile b/evrMrmApp/Db/Makefile index cd5bb998..1ba8fd7c 100644 --- a/evrMrmApp/Db/Makefile +++ b/evrMrmApp/Db/Makefile @@ -21,6 +21,7 @@ DB += evr-tg-300.db DB += evr-mtca-300.db DB += evr-pcie-300dc.db DB += evr-mtca-300rf.db +DB += evr-mtca-300u.db ifneq ($(DEVIOCSTATS),) DB_INSTALLS += $(DEVIOCSTATS)/db/iocAdminRTEMS.db diff --git a/evrMrmApp/Db/evr-mtca-300u.substitutions b/evrMrmApp/Db/evr-mtca-300u.substitutions new file mode 100644 index 00000000..d424cfe3 --- /dev/null +++ b/evrMrmApp/Db/evr-mtca-300u.substitutions @@ -0,0 +1,268 @@ +# Record set for a mTCA-EVR-300 +# +# Macros: +# EVR = Card name (same as mrmEvrSetupPCI()) +# SYS = System name (ie SR-TM) +# D = Device name (ie EVR:Diag2) +# FEVT = Event link frequency (default 124.916 MHz) +# +# Record names have the general forms: +# $(SYS){$(D)}Signal-SD +# $(SYS){$(D)-SubDev}Signal-SD + +file "mrmevrbase.template" +{ +{P="$(SYS){$(D)}", OBJ="$(EVR)", EVNT1HZ="\$(EVNT1HZ=125)", FEVT="\$(FEVT=124.916)"} +} +file "databuftx.db" +{pattern +{P, OBJ, PROTO} +{"$(SYS){$(D)}", "$(EVR):BUFTX", 1} +} + +file "evrSoftEvt.template" +{ +{P="$(SYS){$(D)}", OBJ="$(EVR)"} +} + +file "databuftxCtrl.db" +{pattern +{P, OBJ} +{"$(SYS){$(D)}", "$(EVR):BUFTX"} +} + +file "mrmevrbufrx.db" +{pattern +{P, OBJ, PROTO} +{"$(SYS){$(D)}", $(EVR):BUFRX, 0xff00} +} + +file mrmSoftSeq.template { +pattern { P, EVG, seqNum, NELM } +{ "$(SYS){$(D)-SoftSeq:0}", $(EVR), 0, 2047 } +{ "$(SYS){$(D)-SoftSeq:1}", $(EVR), 1, 2047 } +{ "$(SYS){$(D)-SoftSeq:2}", $(EVR), 2, 2047 } +} + +file evrSoftSeq.template { +pattern { P, EVG, seqNum, NELM } +{ "$(SYS){$(D)-SoftSeq:0}", $(EVR), 0, 2047 } +{ "$(SYS){$(D)-SoftSeq:1}", $(EVR), 1, 2047 } +{ "$(SYS){$(D)-SoftSeq:2}", $(EVR), 2, 2047 } +} + +file "sfp.db" +{ +{P="$(SYS){$(D)-SFP}", OBJ="$(EVR):SFP"} +} + +file "mrmevrdc.template" +{ +{P="$(SYS){$(D)-DC}", OBJ="$(EVR)"} +} + +file "evrmap.db" +{pattern +{NAME, OBJ, func, EVT} +{"$(SYS){$(D)}Evt:Blink0-SP", "$(EVR)", Blink, 15} +{"$(SYS){$(D)}Evt:Blink1-SP", "$(EVR)", Blink, 0} +{"$(SYS){$(D)}Evt:ResetPS-SP","$(EVR)", "Reset PS", 123} +} + +file "evrevent.db" +{pattern +{EN, OBJ, CODE, EVNT} +{"$(SYS){$(D)}1hz", "$(EVR)", 0x7d, 125} +{"$(SYS){$(D)}EvtA", "$(EVR)", 10, 10} +{"$(SYS){$(D)}EvtB", "$(EVR)", 11, 11} +{"$(SYS){$(D)}EvtC", "$(EVR)", 12, 12} +{"$(SYS){$(D)}EvtD", "$(EVR)", 13, 13} +{"$(SYS){$(D)}EvtE", "$(EVR)", 14, 14} +{"$(SYS){$(D)}EvtF", "$(EVR)", 15, 15} +{"$(SYS){$(D)}EvtG", "$(EVR)", 16, 16} +{"$(SYS){$(D)}EvtH", "$(EVR)", 17, 17} +} + +file "evrscale.db" +{pattern +{IDX, P, SN, OBJ, MAX} +{0, "$(SYS){$(D)}", "$(SYS){$(D)-PS:$(IDX)}", "$(EVR):PS$(IDX)", "0xffffffff"} +{1, "$(SYS){$(D)}", "$(SYS){$(D)-PS:$(IDX)}", "$(EVR):PS$(IDX)", "0xffffffff"} +{2, "$(SYS){$(D)}", "$(SYS){$(D)-PS:$(IDX)}", "$(EVR):PS$(IDX)", "0xffffffff"} +{3, "$(SYS){$(D)}", "$(SYS){$(D)-PS:$(IDX)}", "$(EVR):PS$(IDX)", "0xffffffff"} +{4, "$(SYS){$(D)}", "$(SYS){$(D)-PS:$(IDX)}", "$(EVR):PS$(IDX)", "0xffffffff"} +{5, "$(SYS){$(D)}", "$(SYS){$(D)-PS:$(IDX)}", "$(EVR):PS$(IDX)", "0xffffffff"} +{6, "$(SYS){$(D)}", "$(SYS){$(D)-PS:$(IDX)}", "$(EVR):PS$(IDX)", "0xffffffff"} +{7, "$(SYS){$(D)}", "$(SYS){$(D)-PS:$(IDX)}", "$(EVR):PS$(IDX)", "0xffffffff"} +} + +file "mrmevrout.db" +{pattern +{ON, OBJ, DESC} +{"$(SYS){$(D)-Out:Int}", "$(EVR):Int", "Internal"} +{"$(SYS){$(D)-Out:FP0}", "$(EVR):FrontOut0", "OUT0 (TTL)"} +{"$(SYS){$(D)-Out:FP1}", "$(EVR):FrontOut1", "OUT1 (TTL)"} +{"$(SYS){$(D)-Out:FP2}", "$(EVR):FrontOut2", "OUT2 (TTL)"} +{"$(SYS){$(D)-Out:FP3}", "$(EVR):FrontOut3", "OUT3 (TTL)"} +{"$(SYS){$(D)-Out:FPUV0}", "$(EVR):FrontUnivOut0", "UNIV0"} +{"$(SYS){$(D)-Out:FPUV1}", "$(EVR):FrontUnivOut1", "UNIV1"} +{"$(SYS){$(D)-Out:FPUV2}", "$(EVR):FrontUnivOut2", "UNIV2"} +{"$(SYS){$(D)-Out:FPUV3}", "$(EVR):FrontUnivOut3", "UNIV3"} +# default to tri-state for backplane lines +pattern +{ON, OBJ, DESC, DEFAULT} +{"$(SYS){$(D)-Out:Back0}", "$(EVR):Backplane0", "RX17 (0)", 61} +{"$(SYS){$(D)-Out:Back1}", "$(EVR):Backplane1", "TX17 (1)", 61} +{"$(SYS){$(D)-Out:Back2}", "$(EVR):Backplane2", "RX18 (2)", 61} +{"$(SYS){$(D)-Out:Back3}", "$(EVR):Backplane3", "TX18 (3)", 61} +{"$(SYS){$(D)-Out:Back4}", "$(EVR):Backplane4", "RX19 (4)", 61} +{"$(SYS){$(D)-Out:Back5}", "$(EVR):Backplane5", "TX19 (5)", 61} +{"$(SYS){$(D)-Out:Back6}", "$(EVR):Backplane6", "RX20 (6)", 61} +{"$(SYS){$(D)-Out:Back7}", "$(EVR):Backplane7", "TX20 (7)", 61} +{"$(SYS){$(D)-Out:TCLKA}", "$(EVR):FrontUnivOut16", "TCLKA", 61} +{"$(SYS){$(D)-Out:TCLKB}", "$(EVR):FrontUnivOut17", "TCLKB", 61} +} + +file "mrmevroutint.db" +{{ + ON="$(SYS){$(D)-Out:Int}", OBJ="$(EVR)" +}} + +file "evrcml.db" +{pattern +{P, ON, OBJ} +{"$(SYS){$(D)}", "$(SYS){$(D)-Out:TCLKA}", "$(EVR):CML0"} +{"$(SYS){$(D)}", "$(SYS){$(D)-Out:TCLKB}", "$(EVR):CML1"} +} + +# Pulse generators w/o a prescaler set NOPS=1 +file "evrpulser.db" +{pattern +{PID, P, PN, OBJ, DMAX, WMAX, PMAX, NOPS} +{0, "$(SYS){$(D)}", "$(SYS){$(D)-DlyGen:$(PID)}", "$(EVR):Pul$(PID)", "0xffffffff", "0xffffffff", "0xffff", 0} +{1, "$(SYS){$(D)}", "$(SYS){$(D)-DlyGen:$(PID)}", "$(EVR):Pul$(PID)", "0xffffffff", "0xffffffff", "0xffff", 0} +{2, "$(SYS){$(D)}", "$(SYS){$(D)-DlyGen:$(PID)}", "$(EVR):Pul$(PID)", "0xffffffff", "0xffffffff", "0xffff", 0} +{3, "$(SYS){$(D)}", "$(SYS){$(D)-DlyGen:$(PID)}", "$(EVR):Pul$(PID)", "0xffffffff", "0xffffffff", "0xffff", 0} +{4, "$(SYS){$(D)}", "$(SYS){$(D)-DlyGen:$(PID)}", "$(EVR):Pul$(PID)", "0xffffffff", "0xffff", "1", 1} +{5, "$(SYS){$(D)}", "$(SYS){$(D)-DlyGen:$(PID)}", "$(EVR):Pul$(PID)", "0xffffffff", "0xffff", "1", 1} +{6, "$(SYS){$(D)}", "$(SYS){$(D)-DlyGen:$(PID)}", "$(EVR):Pul$(PID)", "0xffffffff", "0xffff", "1", 1} +{7, "$(SYS){$(D)}", "$(SYS){$(D)-DlyGen:$(PID)}", "$(EVR):Pul$(PID)", "0xffffffff", "0xffff", "1", 1} +{8, "$(SYS){$(D)}", "$(SYS){$(D)-DlyGen:$(PID)}", "$(EVR):Pul$(PID)", "0xffffffff", "0xffff", "1", 1} +{9, "$(SYS){$(D)}", "$(SYS){$(D)-DlyGen:$(PID)}", "$(EVR):Pul$(PID)", "0xffffffff", "0xffff", "1", 1} +{10,"$(SYS){$(D)}", "$(SYS){$(D)-DlyGen:$(PID)}", "$(EVR):Pul$(PID)", "0xffffffff", "0xffff", "1", 1} +{11,"$(SYS){$(D)}", "$(SYS){$(D)-DlyGen:$(PID)}", "$(EVR):Pul$(PID)", "0xffffffff", "0xffff", "1", 1} +{12,"$(SYS){$(D)}", "$(SYS){$(D)-DlyGen:$(PID)}", "$(EVR):Pul$(PID)", "0xffffffff", "0xffff", "1", 1} +{13,"$(SYS){$(D)}", "$(SYS){$(D)-DlyGen:$(PID)}", "$(EVR):Pul$(PID)", "0xffffffff", "0xffff", "1", 1} +{14,"$(SYS){$(D)}", "$(SYS){$(D)-DlyGen:$(PID)}", "$(EVR):Pul$(PID)", "0xffffffff", "0xffff", "1", 1} +{15,"$(SYS){$(D)}", "$(SYS){$(D)-DlyGen:$(PID)}", "$(EVR):Pul$(PID)", "0xffffffff", "0xffff", "1", 1} +# gate generators +{28,"$(SYS){$(D)}", "$(SYS){$(D)-DlyGen:$(PID)}", "$(EVR):Pul$(PID)", "0xffffffff", "0xffff", "1", 1} +{29,"$(SYS){$(D)}", "$(SYS){$(D)-DlyGen:$(PID)}", "$(EVR):Pul$(PID)", "0xffffffff", "0xffff", "1", 1} +{30,"$(SYS){$(D)}", "$(SYS){$(D)-DlyGen:$(PID)}", "$(EVR):Pul$(PID)", "0xffffffff", "0xffff", "1", 1} +{31,"$(SYS){$(D)}", "$(SYS){$(D)-DlyGen:$(PID)}", "$(EVR):Pul$(PID)", "0xffffffff", "0xffff", "1", 1} +} + +# Default to 3 possible trigger mappings per pulser +file "evrpulsermap.db" +{pattern +{PID, NAME, OBJ, F, EVT} +{0, "$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig0-SP", "$(EVR):Pul$(PID)", Trig, 0} +{0, "$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig1-SP", "$(EVR):Pul$(PID)", Trig, 0} +{0, "$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig2-SP", "$(EVR):Pul$(PID)", Trig, 0} +{1, "$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig0-SP", "$(EVR):Pul$(PID)", Trig, 0} +{1, "$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig1-SP", "$(EVR):Pul$(PID)", Trig, 0} +{1, "$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig2-SP", "$(EVR):Pul$(PID)", Trig, 0} +{2, "$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig0-SP", "$(EVR):Pul$(PID)", Trig, 0} +{2, "$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig1-SP", "$(EVR):Pul$(PID)", Trig, 0} +{2, "$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig2-SP", "$(EVR):Pul$(PID)", Trig, 0} +{3, "$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig0-SP", "$(EVR):Pul$(PID)", Trig, 0} +{3, "$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig1-SP", "$(EVR):Pul$(PID)", Trig, 0} +{3, "$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig2-SP", "$(EVR):Pul$(PID)", Trig, 0} +{4, "$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig0-SP", "$(EVR):Pul$(PID)", Trig, 0} +{4, "$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig1-SP", "$(EVR):Pul$(PID)", Trig, 0} +{4, "$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig2-SP", "$(EVR):Pul$(PID)", Trig, 0} +{5, "$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig0-SP", "$(EVR):Pul$(PID)", Trig, 0} +{5, "$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig1-SP", "$(EVR):Pul$(PID)", Trig, 0} +{5, "$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig2-SP", "$(EVR):Pul$(PID)", Trig, 0} +{6, "$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig0-SP", "$(EVR):Pul$(PID)", Trig, 0} +{6, "$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig1-SP", "$(EVR):Pul$(PID)", Trig, 0} +{6, "$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig2-SP", "$(EVR):Pul$(PID)", Trig, 0} +{7, "$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig0-SP", "$(EVR):Pul$(PID)", Trig, 0} +{7, "$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig1-SP", "$(EVR):Pul$(PID)", Trig, 0} +{7, "$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig2-SP", "$(EVR):Pul$(PID)", Trig, 0} +{8, "$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig0-SP", "$(EVR):Pul$(PID)", Trig, 0} +{8, "$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig1-SP", "$(EVR):Pul$(PID)", Trig, 0} +{8, "$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig2-SP", "$(EVR):Pul$(PID)", Trig, 0} +{9, "$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig0-SP", "$(EVR):Pul$(PID)", Trig, 0} +{9, "$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig1-SP", "$(EVR):Pul$(PID)", Trig, 0} +{9, "$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig2-SP", "$(EVR):Pul$(PID)", Trig, 0} +{10,"$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig0-SP", "$(EVR):Pul$(PID)", Trig, 0} +{10,"$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig1-SP", "$(EVR):Pul$(PID)", Trig, 0} +{10,"$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig2-SP", "$(EVR):Pul$(PID)", Trig, 0} +{11,"$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig0-SP", "$(EVR):Pul$(PID)", Trig, 0} +{11,"$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig1-SP", "$(EVR):Pul$(PID)", Trig, 0} +{11,"$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig2-SP", "$(EVR):Pul$(PID)", Trig, 0} +{12,"$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig0-SP", "$(EVR):Pul$(PID)", Trig, 0} +{12,"$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig1-SP", "$(EVR):Pul$(PID)", Trig, 0} +{12,"$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig2-SP", "$(EVR):Pul$(PID)", Trig, 0} +{13,"$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig0-SP", "$(EVR):Pul$(PID)", Trig, 0} +{13,"$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig1-SP", "$(EVR):Pul$(PID)", Trig, 0} +{13,"$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig2-SP", "$(EVR):Pul$(PID)", Trig, 0} +{14,"$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig0-SP", "$(EVR):Pul$(PID)", Trig, 0} +{14,"$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig1-SP", "$(EVR):Pul$(PID)", Trig, 0} +{14,"$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig2-SP", "$(EVR):Pul$(PID)", Trig, 0} +{15,"$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig0-SP", "$(EVR):Pul$(PID)", Trig, 0} +{15,"$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig1-SP", "$(EVR):Pul$(PID)", Trig, 0} +{15,"$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig2-SP", "$(EVR):Pul$(PID)", Trig, 0} +# gate generators mappings +{28,"$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig0-SP", "$(EVR):Pul$(PID)", Trig, 0} +{28,"$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig1-SP", "$(EVR):Pul$(PID)", Trig, 0} +{28,"$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig2-SP", "$(EVR):Pul$(PID)", Trig, 0} +{29,"$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig0-SP", "$(EVR):Pul$(PID)", Trig, 0} +{29,"$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig1-SP", "$(EVR):Pul$(PID)", Trig, 0} +{29,"$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig2-SP", "$(EVR):Pul$(PID)", Trig, 0} +{30,"$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig0-SP", "$(EVR):Pul$(PID)", Trig, 0} +{30,"$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig1-SP", "$(EVR):Pul$(PID)", Trig, 0} +{30,"$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig2-SP", "$(EVR):Pul$(PID)", Trig, 0} +{31,"$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig0-SP", "$(EVR):Pul$(PID)", Trig, 0} +{31,"$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig1-SP", "$(EVR):Pul$(PID)", Trig, 0} +{31,"$(SYS){$(D)-DlyGen:$(PID)}Evt:Trig2-SP", "$(EVR):Pul$(PID)", Trig, 0} +} + +# pulser masking controls +file "evrdcpulser.template" +{pattern +{PID, P, PN, OBJ} +{0, "$(SYS){$(D)}", "$(SYS){$(D)-DlyGen:$(PID)}", "$(EVR):Pul$(PID)"} +{1, "$(SYS){$(D)}", "$(SYS){$(D)-DlyGen:$(PID)}", "$(EVR):Pul$(PID)"} +{2, "$(SYS){$(D)}", "$(SYS){$(D)-DlyGen:$(PID)}", "$(EVR):Pul$(PID)"} +{3, "$(SYS){$(D)}", "$(SYS){$(D)-DlyGen:$(PID)}", "$(EVR):Pul$(PID)"} +{4, "$(SYS){$(D)}", "$(SYS){$(D)-DlyGen:$(PID)}", "$(EVR):Pul$(PID)"} +{5, "$(SYS){$(D)}", "$(SYS){$(D)-DlyGen:$(PID)}", "$(EVR):Pul$(PID)"} +{6, "$(SYS){$(D)}", "$(SYS){$(D)-DlyGen:$(PID)}", "$(EVR):Pul$(PID)"} +{7, "$(SYS){$(D)}", "$(SYS){$(D)-DlyGen:$(PID)}", "$(EVR):Pul$(PID)"} +{8, "$(SYS){$(D)}", "$(SYS){$(D)-DlyGen:$(PID)}", "$(EVR):Pul$(PID)"} +{9, "$(SYS){$(D)}", "$(SYS){$(D)-DlyGen:$(PID)}", "$(EVR):Pul$(PID)"} +{10, "$(SYS){$(D)}", "$(SYS){$(D)-DlyGen:$(PID)}", "$(EVR):Pul$(PID)"} +{11, "$(SYS){$(D)}", "$(SYS){$(D)-DlyGen:$(PID)}", "$(EVR):Pul$(PID)"} +{12, "$(SYS){$(D)}", "$(SYS){$(D)-DlyGen:$(PID)}", "$(EVR):Pul$(PID)"} +{13, "$(SYS){$(D)}", "$(SYS){$(D)-DlyGen:$(PID)}", "$(EVR):Pul$(PID)"} +{14, "$(SYS){$(D)}", "$(SYS){$(D)-DlyGen:$(PID)}", "$(EVR):Pul$(PID)"} +{15, "$(SYS){$(D)}", "$(SYS){$(D)-DlyGen:$(PID)}", "$(EVR):Pul$(PID)"} +} + +file "evrin.db" +{pattern +{IN, OBJ, DESC} +{"$(SYS){$(D)-In:0}", "$(EVR):FPIn0", "IN0 (TTL)"} +{"$(SYS){$(D)-In:1}", "$(EVR):FPIn1", "IN1 (TTL)"} +} + +file "mrmevrdlymodule.template" +{pattern +{SLOT, P, OBJ} +{0, "$(SYS){$(D)-Out:FPDly$(SLOT)}", "$(EVR)"} +{1, "$(SYS){$(D)-Out:FPDly$(SLOT)}", "$(EVR)"} +} + +