{ *************************************************************************** } MODULE mod_tree_execute ; { Created 19-FEB-1993 MICHIGAN STATE UNIVERSITY, TRIGGER CONTROL SOFTWARE } { *************************************************************************** } INCLUDE mod_common_global_flags, mod_common_soft_conn, mod_common_parse, mod_handle_tracing, mod_def_hardware_tables, mod_def_physics_tables, mod_init_lsm, mod_handle_registers, mod_handle_cat_cards, mod_parse_detail ; { *************************************************************************** } EXPORT tree_cat2, {PROCEDURE read a CAT2 operand } tree_cat3, {PROCEDURE read a CAT3 operand } tree_eng_twr, {PROCEDURE read a CTFE ADC byte } tree_eng_fe, {PROCEDURE read the output of a CTFE at input of T1 CAT2} tree_eng_t1, {PROCEDURE read the output of a T1 at input of T2 CAT2} tree_eng_t2, {PROCEDURE read the output of a T2 at input of T3 CAT2} tree_eng_t3, {PROCEDURE read the output of a T3 at input of IMLRO } tree_eng_TOT, {PROCEDURE read the output of a T4 at input of IMLRO } tree_mispt, {PROCEDURE read the output of a FMLN at input of IMLRO } tree_cnt_twr, {PROCEDURE read the output of a CTFE at input of CHTCR } tree_cnt_t1, {PROCEDURE read the output of a T1 at input of T2 CAT2} tree_cnt_t2, {PROCEDURE read the output of a T2 at input of T3 CAT2} tree_cnt_t3 ; {PROCEDURE read the output of a T3 at input of IMLRO } { *************************************************************************** } IMPORT status_type, {from module MOD_COMMON_GLOBAL_FLAGS } not_found, {from module MOD_COMMON_GLOBAL_FLAGS } param, {from module MOD_COMMON_SOFT_CONN } replymsg, {from module MOD_COMMON_SOFT_CONN } reqstmsg, {from module MOD_COMMON_SOFT_CONN } con_served, {from module MOD_COMMON_SOFT_CONN } parsed_command, {from module MOD_COMMON_PARSE } command_count, {from module MOD_COMMON_PARSE } parse_status, {from module MOD_COMMON_PARSE } {parse_code, Parse_success,}Parse_failure, Parse_asserted,{Parse_negated,} {Parse_par_still_empty, Parse_par_found_empty,} Parse_no_par_found,{ parse_not_in_list,}parse_found_keyword, parse_illegal_keyword, parse_kword_ref, handle_trc_inf, {from module MOD_HANDLE_TRACING } handle_trc_err, {from module MOD_HANDLE_TRACING } cbus_register, {from module MOD_DEF_HARDWARE_TABLES } find_card_pointer, {from module MOD_DEF_HARDWARE_TABLES } eta_polarity, pos_e, neg_e, {from module MOD_DEF_HARDWARE_TABLES } eta_magnitude,{e_1, e_20,} {from module MOD_DEF_HARDWARE_TABLES } relative_eta, {from module MOD_DEF_HARDWARE_TABLES } magn_eta_per_fe_cell, {from module MOD_DEF_HARDWARE_TABLES } eta_per_rack_pair, {from module MOD_DEF_HARDWARE_TABLES } phi_value, {from module MOD_DEF_HARDWARE_TABLES } p_1, p_8, p_9, p_16, p_17, p_24, p_25, p_32, phi_per_fe_half_cell, {from module MOD_DEF_HARDWARE_TABLES } p_1_8, p_9_16, p_17_24, p_25_32, {from module MOD_DEF_HARDWARE_TABLES } phi_per_fe_cell, {from module MOD_DEF_HARDWARE_TABLES } relative_phi, {from module MOD_DEF_HARDWARE_TABLES } relp_0, relp_1, relp_2, relp_3, relp_4, relp_5, relp_6, relp_7, momentum_sign, pos_m, neg_m, {from module MOD_DEF_HARDWARE_TABLES } threshold_reference_set_number, {from module MOD_DEF_HARDWARE_TABLES } adc_data_type_per_ctfe_channel, EMEtZ0, HDEtZ0, threshold_comparison_type, EMEt_cmp, TOTEt_cmp, lookup_data_topic, Et, L2, {from module MOD_DEF_HARDWARE_TABLES } lookup_data_type, {from module MOD_DEF_HARDWARE_TABLES } EMEt, EML2, HDEt, HDL2, Px, Py, {from module MOD_DEF_HARDWARE_TABLES } Global_EMEt, Global_EML2, Global_HDEt, Global_HDL2, Global_TotEt, Global_TotL2, card_header, {from module MOD_DEF_HARDWARE_TABLES } ctfe_card_low_half, {from module MOD_DEF_HARDWARE_TABLES } ctfe_data, {from module MOD_DEF_HARDWARE_TABLES } bit_0_5, {from module MOD_DEF_HARDWARE_TABLES } cat2_card, cat3_card, {from module MOD_DEF_HARDWARE_TABLES } cat2_EME_t1, cat2_HDE_t1, cat2_PxM_t1, cat2_PyM_t1, cat2_EME_t2, cat2_HDE_t2, cat2_PxM_t2, cat2_PyM_t2, cat3_EM_Et_t3, cat3_HD_Et_t3, cat3_Px_t3, cat3_Py_t3, imlro_energy_2_card, imlro_tower_counts_card, imlro_caltrig_aux, imlro_eng1, imlro_eng2, imlro_ct_aux, imlro_cnts, first_byte, chtcr_card_low_half, chtcr_inputs, cat2_EMC_t2, cat2_TOTC_t2, cat2_EM_cnt_t3, cat2_TOT_cnt_t3, {from module MOD_DEF_HARDWARE_TABLES } firstetasign, {from module MOD_DEF_PHYSICS_TABLES } lastetasign, {from module MOD_DEF_PHYSICS_TABLES } firstetamagn, {from module MOD_DEF_PHYSICS_TABLES } lastetamagn, {from module MOD_DEF_PHYSICS_TABLES } firstphival, {from module MOD_DEF_PHYSICS_TABLES } lastphival, {from module MOD_DEF_PHYSICS_TABLES } firstemrefset, {from module MOD_DEF_PHYSICS_TABLES } lastemrefset, {from module MOD_DEF_PHYSICS_TABLES } firsttotrefset, {from module MOD_DEF_PHYSICS_TABLES } lasttotrefset, {from module MOD_DEF_PHYSICS_TABLES } trgtwr, {from module MOD_DEF_PHYSICS_TABLES } tree_offset, {from module MOD_DEF_PHYSICS_TABLES } sum_zeresp, {from module MOD_INIT_LSM } examine_register, {from module MOD_HANDLE_REGISTER } examine_multi_byte, {from module MOD_HANDLE_REGISTER } examine_cat2_operand, {from module MOD_HANDLE_CAT_CARDS } examine_cat3_operand, {from module MOD_HANDLE_CAT_CARDS } bad_format, bad_param, bad_failure, {from module MOD_PARSE_DETAIL } inline_check_command_count, {from module MOD_PARSE_DETAIL } inline_check_object_asserted, {from module MOD_PARSE_DETAIL } inline_check_object_has_no_item, {from module MOD_PARSE_DETAIL } inline_check_object_in_range, {from module MOD_PARSE_DETAIL } inline_check_object_keyword, {from module MOD_PARSE_DETAIL } inline_check_object_has_item, {from module MOD_PARSE_DETAIL } inline_check_item_in_range, {from module MOD_PARSE_DETAIL } inline_check_max_one_item, {from module MOD_PARSE_DETAIL } find_and_check_ranges ; {from module MOD_PARSE_DETAIL } { *************************************************************************** } TYPE byte = [BYTE] 0..255 ; SET_OF_eta_polarity = SET OF eta_polarity ; SET_OF_eta_magnitude = SET OF eta_magnitude ; SET_OF_phi_value = SET OF phi_value ; VAR command : INTEGER ; status : status_type ; tag : VARYING_STRING(8) := 'TRE/EXE%' ; tagext : VARYING_STRING(8) ; { *************************************************************************** } { *************************************************************************** } PROCEDURE tree_cat2 ; VAR op_num : INTEGER; p_cat2 :^cat2_card ; reg_pointer :^cbus_register ; data : INTEGER ; BEGIN tagext := inline_tag_ext ; inline_check_command_count ( TOTAL := 4 ) ; inline_check_object_in_range ( COMMAND := 1, LOW := 0, HIGH := 3 ) ; inline_check_object_asserted ( COMMAND := 1 ) ; inline_check_object_has_no_item ( COMMAND := 1 ) ; param^.cbus := parsed_command^[1].objid ; inline_check_object_in_range ( COMMAND := 2, LOW := 0, HIGH := 255 ) ; inline_check_object_asserted ( COMMAND := 2 ) ; inline_check_object_has_no_item ( COMMAND := 2 ) ; param^.mba := parsed_command^[2].objid ; inline_check_object_in_range ( COMMAND := 3, LOW := 0, HIGH := 63 ) ; inline_check_object_asserted ( COMMAND := 3 ) ; inline_check_object_has_no_item ( COMMAND := 3 ) ; param^.ca := parsed_command^[3].objid ; inline_check_object_in_range ( COMMAND := 4, LOW := 1, HIGH := 8 ) ; inline_check_object_asserted ( COMMAND := 4 ) ; inline_check_object_has_no_item ( COMMAND := 4 ) ; op_num := parsed_command^[4].objid ; IF ( parse_status = parse_failure ) THEN GOTO quit_tree_cat2 ; find_card_pointer ( CBUS := param^.cbus, MBA := param^.mba, CA := param^.ca, CARD := p_cat2, STATUS := status ) ; IF ( status = not_found ) THEN BEGIN handle_trc_err ( TAG := tag + tagext, MESSAGE := ' CAT2 Card Not Found in Hard Data Base ' + '@ cbus' + CONVERT(STRING(2),param^.cbus) + ' mba' + CONVERT(STRING(4),param^.mba) + ' ca' + CONVERT(STRING(3),param^.ca) ); bad_failure ; GOTO quit_tree_cat2 ; END ; IF ( p_cat2^.regtotal <> 35 ) THEN BEGIN handle_trc_err ( TAG := tag + tagext, MESSAGE := ' The Card Found ' + '@ cbus' + CONVERT(STRING(2),param^.cbus) + ' mba' + CONVERT(STRING(4),param^.mba) + ' ca' + CONVERT(STRING(3),param^.ca) + ' has ' + CONVERT(STRING,p_cat2^.regtotal) + ' registers, a CAT2 card has 35'); bad_failure ; GOTO quit_tree_cat2 ; END ; examine_cat2_operand ( TAGEXT := tagext, CARD := p_cat2, OP_NUM := op_num, OP_VALUE := data, IOPAR := param ) ; replymsg[con_served]^.replysupl := CONVERT(STRING(8),data) ; quit_tree_cat2 : END ; { *************************************************************************** } { *************************************************************************** } PROCEDURE tree_cat3 ; VAR op_num : INTEGER; p_cat3 :^cat3_card ; reg_pointer :^cbus_register ; data : INTEGER ; buffer : VARYING_STRING(80) ; BEGIN tagext := inline_tag_ext ; inline_check_command_count ( TOTAL := 4 ) ; inline_check_object_in_range ( COMMAND := 1, LOW := 0, HIGH := 3 ) ; inline_check_object_asserted ( COMMAND := 1 ) ; inline_check_object_has_no_item ( COMMAND := 1 ) ; param^.cbus := parsed_command^[1].objid ; inline_check_object_in_range ( COMMAND := 2, LOW := 0, HIGH := 255 ) ; inline_check_object_asserted ( COMMAND := 2 ) ; inline_check_object_has_no_item ( COMMAND := 2 ) ; param^.mba := parsed_command^[2].objid ; inline_check_object_in_range ( COMMAND := 3, LOW := 0, HIGH := 63 ) ; inline_check_object_asserted ( COMMAND := 3 ) ; inline_check_object_has_no_item ( COMMAND := 3 ) ; param^.ca := parsed_command^[3].objid ; inline_check_object_in_range ( COMMAND := 4, LOW := 1, HIGH := 6 ) ; inline_check_object_asserted ( COMMAND := 4 ) ; inline_check_object_has_no_item ( COMMAND := 4 ) ; op_num := parsed_command^[4].objid ; IF ( parse_status = parse_failure ) THEN GOTO quit_tree_cat3 ; find_card_pointer ( CBUS := param^.cbus, MBA := param^.mba, CA := param^.ca, CARD := p_cat3, STATUS := status ) ; IF ( status = not_found ) THEN BEGIN handle_trc_err ( TAG := tag + tagext, MESSAGE := ' CAT3 Card Not Found in Hard Data Base ' + '@ cbus' + CONVERT(STRING(2),param^.cbus) + ' mba' + CONVERT(STRING(4),param^.mba) + ' ca' + CONVERT(STRING(3),param^.ca) ); bad_failure ; GOTO quit_tree_cat3 ; END ; IF ( p_cat3^.regtotal <> 40 ) THEN BEGIN handle_trc_err ( TAG := tag + tagext, MESSAGE := ' The Card Found ' + '@ cbus' + CONVERT(STRING(2),param^.cbus) + ' mba' + CONVERT(STRING(4),param^.mba) + ' ca' + CONVERT(STRING(3),param^.ca) + ' has ' + CONVERT(STRING,p_cat3^.regtotal) + ' registers, a CAT3 card has 40'); bad_failure ; GOTO quit_tree_cat3 ; END ; examine_cat3_operand ( TAGEXT := tagext, CARD := p_cat3, OP_NUM := op_num, OP_VALUE := data, IOPAR := param ) ; replymsg[con_served]^.replysupl := CONVERT(STRING(8),data) ; quit_tree_cat3 : END ; { *************************************************************************** } { *************************************************************************** } PROCEDURE tree_eng_twr ( tower_type : lookup_data_type ) ; VAR eta_pol : eta_polarity ; eta_mag : eta_magnitude ; phi_val : phi_value ; twr_typ : adc_data_type_per_ctfe_channel ; eta_cell : magn_eta_per_fe_cell ; rel_eta : relative_eta ; p_ctfe_data :^ctfe_card_low_half ; p_adc_reg :^cbus_register ; data : byte ; zeresp : INTEGER ; buffer : VARYING_STRING(80) ; BEGIN find_first_tower ( ETA_POL := eta_pol, ETA_MAG := eta_mag, PHI_VAL := phi_val ) ; IF ( parse_status = parse_failure ) THEN GOTO quit_tree_eng_twr ; IF ( command <= command_count ) THEN bad_format ( TAGEXT := tagext, COMMAND := command ) ; IF ( parse_status = parse_failure ) THEN GOTO quit_tree_eng_twr ; CASE tower_type OF EMEt : twr_typ := EMEtZ0 ; HDEt : twr_typ := HDEtZ0 ; OTHERWISE handle_trc_err ( TAG := tag + tagext, MESSAGE := ' illegal parameter call to tree_eng_twr') ; END ; eta_cell := CONVERT ( magn_eta_per_fe_cell, (ORD(eta_mag)-1) DIV 4 ) ; rel_eta := CONVERT ( relative_eta, (ORD(eta_mag)-1) MOD 4 ) ; p_ctfe_data := ADDRESS ( ctfe_data[eta_pol,eta_cell,phi_val] ) ; p_adc_reg := ADDRESS ( p_ctfe_data^.muxout[rel_eta,twr_typ] ) ; examine_register ( TAGEXT := tagext, CARD := p_ctfe_data, REGISTER := p_adc_reg, SLICEAGE := 0, IOPAR := param, DATA := data ) ; zeresp := trgtwr[eta_pol,eta_mag,phi_val]^.adconv[twr_typ].zeresp ; buffer := ' ZER=' + CONVERT(STRING,zeresp) + ' CTFE @ ' + CONVERT(STRING,p_ctfe_data^.cbus) + '/' + CONVERT(STRING,p_ctfe_data^.mba) + '/' + CONVERT(STRING,p_ctfe_data^.ca) + '/' + CONVERT(STRING,p_adc_reg^.fa+224) + ' ' + CONVERT(STRING(2),tower_type) + ',' + CONVERT(STRING(3),eta_pol) + ',' + CONVERT(STRING,eta_mag) + ',' + CONVERT(STRING,phi_val) ; replymsg[con_served]^.replysupl := CONVERT(STRING(8),data) ; replymsg[con_served]^.replystring := buffer ; handle_trc_inf ( TAG := tag + tagext, MESSAGE := ' Tower ADC=' + CONVERT(STRING,data) + buffer ) ; quit_tree_eng_twr: END ; { *************************************************************************** } { *************************************************************************** } PROCEDURE tree_eng_fe ( lookup_type : lookup_data_type ) ; VAR eta_pol : eta_polarity ; eta_mag : eta_magnitude ; phi_val : phi_value ; eta_cell : magn_eta_per_fe_cell ; phi_quad : phi_per_fe_half_cell ; p_cat2 :^cat2_card ; op_num : INTEGER; data : INTEGER ; rel_phi : relative_phi ; low_eta, high_eta : eta_magnitude ; lookup_2nd : lookup_data_type ; zeresp : ARRAY[1..2] OF INTEGER ; buffer : VARYING_STRING(80) ; BEGIN find_first_tower ( ETA_POL := eta_pol, ETA_MAG := eta_mag, PHI_VAL := phi_val ) ; IF ( parse_status = parse_failure ) THEN GOTO quit_tree_eng_fe ; IF ( command <= command_count ) THEN bad_format ( TAGEXT := tagext, COMMAND := command ) ; IF ( parse_status = parse_failure ) THEN GOTO quit_tree_eng_fe ; eta_cell := CONVERT ( magn_eta_per_fe_cell, (ORD(eta_mag)-1) DIV 4 ) ; phi_quad := CONVERT ( phi_per_fe_half_cell, (ORD(phi_val)-1) DIV 8 ) ; rel_phi := CONVERT ( relative_phi, (ORD(phi_val)-1) MOD 8 ) ; CASE lookup_type OF EMEt : p_cat2 := ADDRESS(cat2_EME_t1[eta_pol,eta_cell,phi_quad]::cat2_card); HDEt : p_cat2 := ADDRESS(cat2_HDE_t1[eta_pol,eta_cell,phi_quad]::cat2_card); Px : p_cat2 := ADDRESS(cat2_PxM_t1[eta_pol,eta_cell,phi_quad]::cat2_card); Py : p_cat2 := ADDRESS(cat2_PyM_t1[eta_pol,eta_cell,phi_quad]::cat2_card); OTHERWISE handle_trc_err ( TAG := tag + tagext, MESSAGE := ' illegal parameter call to tree_eng_fe' ) ; END ; op_num := ORD(rel_phi) + 1 ; examine_cat2_operand ( TAGEXT := tagext, CARD := p_cat2, OP_NUM := op_num, OP_VALUE := data, IOPAR := param ) ; low_eta := CONVERT(eta_magnitude, 4*ORD(eta_cell) + 1 ) ; high_eta := CONVERT(eta_magnitude, 4*ORD(eta_cell) + 1 + 3 ) ; sum_zeresp ( LOW_ETA_POL := eta_pol, HIGH_ETA_POL := eta_pol, LOW_ETA_MAG := low_eta, HIGH_ETA_MAG := high_eta, LOW_PHI := phi_val, HIGH_PHI := phi_val, LOOKUP := lookup_type, ZERESP := zeresp[1] ) ; CASE lookup_type OF EMEt : lookup_2nd := EML2 ; HDEt : lookup_2nd := HDL2 ; END ; IF ( ( lookup_type = EMEt ) OR ( lookup_type = HDEt ) ) THEN sum_zeresp ( LOW_ETA_POL := eta_pol, HIGH_ETA_POL := eta_pol, LOW_ETA_MAG := low_eta, HIGH_ETA_MAG := high_eta, LOW_PHI := phi_val, HIGH_PHI := phi_val, LOOKUP := lookup_2nd, ZERESP := zeresp[2] ) ELSE zeresp[2] := zeresp[1] ; buffer := ' ZER=' + CONVERT(STRING,zeresp[1]) + '/' + CONVERT(STRING,zeresp[2]) + ' T1_CAT2 op#' + CONVERT(STRING,ORD(rel_phi)+1) + ' @ '+ CONVERT(STRING,p_cat2^.cbus) + '/' + CONVERT(STRING,p_cat2^.mba) + '/' + CONVERT(STRING,p_cat2^.ca) + '/' + CONVERT(STRING,p_cat2^.inopreg[op_num,bit_0_5].fa) + ' ' + CONVERT(STRING(2),lookup_type) + ',' + CONVERT(STRING(3),eta_pol) + ',' + CONVERT(STRING,eta_cell) + ',' + CONVERT(STRING,phi_val) ; replymsg[con_served]^.replysupl := CONVERT(STRING(8),data) ; replymsg[con_served]^.replystring := buffer ; handle_trc_inf ( TAG := tag + tagext, MESSAGE := ' CTFE sum=' + CONVERT(STRING,data) + buffer ) ; quit_tree_eng_fe: END ; { *************************************************************************** } { *************************************************************************** } PROCEDURE tree_eng_t1 ( lookup_type : lookup_data_type ) ; VAR eta_pol : eta_polarity ; eta_mag : eta_magnitude ; phi_val : phi_value ; eta_cell : magn_eta_per_fe_cell ; phi_quad : phi_per_fe_half_cell ; phi_half : phi_per_fe_cell ; eta_pair : eta_per_rack_pair ; p_cat2 :^cat2_card ; op_num : INTEGER; data : INTEGER ; low_eta, high_eta : eta_magnitude ; low_phi, high_phi : phi_value ; mom_pol : momentum_sign ; zeresp : ARRAY[1..2] OF INTEGER ; lookup_2nd : lookup_data_type ; buffer : VARYING_STRING(80) ; BEGIN find_first_tower ( ETA_POL := eta_pol, ETA_MAG := eta_mag, PHI_VAL := phi_val ) ; IF ( parse_status = parse_failure ) THEN GOTO quit_tree_eng_t1 ; IF ( command <= command_count ) THEN bad_format ( TAGEXT := tagext, COMMAND := command ) ; IF ( parse_status = parse_failure ) THEN GOTO quit_tree_eng_t1 ; eta_cell := CONVERT ( magn_eta_per_fe_cell, (ORD(eta_mag)-1) DIV 4 ) ; eta_pair := CONVERT ( eta_per_rack_pair, (ORD(eta_mag)-1) DIV 8 ) ; phi_quad := CONVERT ( phi_per_fe_half_cell, (ORD(phi_val)-1) DIV 8 ) ; phi_half := CONVERT ( phi_per_fe_cell, (ORD(phi_val)-1) DIV 16) ; CASE lookup_type OF Px : CASE phi_quad OF p_1_8 : mom_pol := pos_m ; p_9_16 : mom_pol := neg_m ; p_17_24 : mom_pol := neg_m ; p_25_32 : mom_pol := pos_m ; END ; Py : CASE phi_quad OF p_1_8 : mom_pol := pos_m ; p_9_16 : mom_pol := pos_m ; p_17_24 : mom_pol := neg_m ; p_25_32 : mom_pol := neg_m ; END ; END ; CASE lookup_type OF EMEt : p_cat2 := ADDRESS(cat2_EME_t2[eta_cell]) ; HDEt : p_cat2 := ADDRESS(cat2_HDE_t2[eta_cell]) ; Px : p_cat2 := ADDRESS(cat2_PxM_t2[mom_pol,eta_pair]) ; Py : p_cat2 := ADDRESS(cat2_PyM_t2[mom_pol,eta_pair]) ; OTHERWISE handle_trc_err ( TAG := tag + tagext, MESSAGE := ' illegal parameter call to tree_eng_t1' ) ; END ; CASE lookup_type OF EMEt, HDEt : op_num := 1 + 2 * ORD(phi_quad) + ORD(eta_pol) ; Px : op_num := 1 + 4 * ORD(eta_pol) + 2 * ORD(phi_half) + ( ORD(eta_cell) MOD 2 ) ; Py : op_num := 1 + 4 * ORD(eta_pol) + 2 * ( ORD(phi_quad) MOD 2 ) + ( ORD(eta_cell) MOD 2 ) ; END ; examine_cat2_operand ( TAGEXT := tagext, CARD := p_cat2, OP_NUM := op_num, OP_VALUE := data, IOPAR := param ) ; low_eta := CONVERT(eta_magnitude, 4*ORD(eta_cell) + 1 ) ; high_eta := CONVERT(eta_magnitude, 4*ORD(eta_cell) + 1 + 3 ) ; low_phi := CONVERT(phi_value, 8*ORD(phi_quad) + 1 ) ; high_phi := CONVERT(phi_value, 8*ORD(phi_quad) + 1 + 7 ) ; sum_zeresp ( LOW_ETA_POL := eta_pol, HIGH_ETA_POL := eta_pol, LOW_ETA_MAG := low_eta, HIGH_ETA_MAG := high_eta, LOW_PHI := low_phi, HIGH_PHI := high_phi, LOOKUP := lookup_type, ZERESP := zeresp[1] ) ; CASE lookup_type OF EMEt : lookup_2nd := EML2 ; HDEt : lookup_2nd := HDL2 ; END ; IF ( ( lookup_type = EMEt ) OR ( lookup_type = HDEt ) ) THEN sum_zeresp ( LOW_ETA_POL := eta_pol, HIGH_ETA_POL := eta_pol, LOW_ETA_MAG := low_eta, HIGH_ETA_MAG := high_eta, LOW_PHI := low_phi, HIGH_PHI := high_phi, LOOKUP := lookup_2nd, ZERESP := zeresp[2] ) ELSE zeresp[2] := zeresp[1] ; buffer := ' ZER=' + CONVERT(STRING,zeresp[1]) + '/' + CONVERT(STRING,zeresp[2]) + ' T2_CAT2 op#' + CONVERT(STRING,op_num) + ' @ '+ CONVERT(STRING,p_cat2^.cbus) + '/' + CONVERT(STRING,p_cat2^.mba) + '/' + CONVERT(STRING,p_cat2^.ca) + '/' + CONVERT(STRING,p_cat2^.inopreg[op_num,bit_0_5].fa) + ' ' + CONVERT(STRING(2),lookup_type) + ',' + CONVERT(STRING(3),eta_pol) + ',' + CONVERT(STRING,eta_cell) + ',' + CONVERT(STRING,phi_quad) ; replymsg[con_served]^.replysupl := CONVERT(STRING(8),data) ; replymsg[con_served]^.replystring := buffer ; handle_trc_inf ( TAG := tag + tagext, MESSAGE := ' T1_CAT2 sum=' + CONVERT(STRING,data) + buffer ) ; quit_tree_eng_t1: END ; { *************************************************************************** } { *************************************************************************** } PROCEDURE tree_eng_t2 ( lookup_type : lookup_data_type ) ; VAR eta_pol : eta_polarity ; eta_mag : eta_magnitude ; phi_val : phi_value ; eta_cell : magn_eta_per_fe_cell ; eta_pair : eta_per_rack_pair ; phi_quad : phi_per_fe_half_cell ; p_cat3 :^cat3_card ; op_num : INTEGER; data : INTEGER ; low_eta, high_eta : eta_magnitude ; low_phi, high_phi : phi_value ; mom_pol : momentum_sign ; zeresp : ARRAY[1..2] OF INTEGER ; lookup_2nd : lookup_data_type ; buffer : VARYING_STRING(80) ; BEGIN find_first_tower ( ETA_POL := eta_pol, ETA_MAG := eta_mag, PHI_VAL := phi_val ) ; IF ( parse_status = parse_failure ) THEN GOTO quit_tree_eng_t2 ; IF ( command <= command_count ) THEN bad_format ( TAGEXT := tagext, COMMAND := command ) ; IF ( parse_status = parse_failure ) THEN GOTO quit_tree_eng_t2 ; eta_cell := CONVERT ( magn_eta_per_fe_cell, (ORD(eta_mag)-1) DIV 4 ) ; eta_pair := CONVERT ( eta_per_rack_pair, (ORD(eta_mag)-1) DIV 8 ) ; phi_quad := CONVERT ( phi_per_fe_half_cell, (ORD(phi_val)-1) DIV 8 ) ; CASE lookup_type OF EMEt : p_cat3 := ADDRESS(cat3_EM_Et_t3[0]) ; HDEt : p_cat3 := ADDRESS(cat3_HD_Et_t3[0]) ; Px : p_cat3 := ADDRESS(cat3_Px_t3) ; Py : p_cat3 := ADDRESS(cat3_Py_t3) ; OTHERWISE handle_trc_err ( TAG := tag + tagext, MESSAGE := ' illegal parameter call to tree_eng_t2' ) ; END ; CASE lookup_type OF Px : CASE phi_quad OF p_1_8 : mom_pol := pos_m ; p_9_16 : mom_pol := neg_m ; p_17_24 : mom_pol := neg_m ; p_25_32 : mom_pol := pos_m ; END ; Py : CASE phi_quad OF p_1_8 : mom_pol := pos_m ; p_9_16 : mom_pol := pos_m ; p_17_24 : mom_pol := neg_m ; p_25_32 : mom_pol := neg_m ; END ; END ; CASE lookup_type OF EMEt, HDEt : op_num := 1 + ORD(eta_cell) ; Px, Py : op_num := 1 + 2 * (ORD(eta_cell) DIV 2) + (1 - ORD(mom_pol)) ; END ; examine_cat3_operand ( TAGEXT := tagext, CARD := p_cat3, OP_NUM := op_num, OP_VALUE := data, IOPAR := param ) ; CASE lookup_type OF EMEt, HDEt : BEGIN low_eta := CONVERT(eta_magnitude, 4*ORD(eta_cell) + 1 ) ; high_eta := CONVERT(eta_magnitude, 4*ORD(eta_cell) + 1 + 3 ) ; low_phi := p_1 ; high_phi := p_32 ; END ; Px : BEGIN low_eta := CONVERT(eta_magnitude, 8*ORD(eta_pair) + 1 ) ; high_eta := CONVERT(eta_magnitude, 8*ORD(eta_pair) + 1 + 7 ) ; CASE mom_pol OF pos_m : BEGIN low_phi := p_1 ; {There are 2 separate regions} high_phi := p_8 ; sum_zeresp ( LOW_ETA_POL := pos_e, HIGH_ETA_POL := neg_e, LOW_ETA_MAG := low_eta, HIGH_ETA_MAG := high_eta, LOW_PHI := low_phi, HIGH_PHI := high_phi, LOOKUP := lookup_type, ZERESP := zeresp[2] ) ; low_phi := p_25 ; high_phi := p_32 ; END ; neg_m : BEGIN low_phi := p_9 ; high_phi := p_24 ; END ; END ; END ; Py : BEGIN low_eta := CONVERT(eta_magnitude, 8*ORD(eta_cell) + 1 ) ; high_eta := CONVERT(eta_magnitude, 8*ORD(eta_pair) + 1 + 7 ) ; CASE mom_pol OF pos_m : BEGIN low_phi := p_1 ; high_phi := p_16 ; END ; neg_m : BEGIN low_phi := p_17 ; high_phi := p_32 ; END ; END ; END ; END ; sum_zeresp ( LOW_ETA_POL := pos_e, HIGH_ETA_POL := neg_e, LOW_ETA_MAG := low_eta, HIGH_ETA_MAG := high_eta, LOW_PHI := low_phi, HIGH_PHI := high_phi, LOOKUP := lookup_type, ZERESP := zeresp[1] ) ; IF ( ( lookup_type = Px ) AND ( mom_pol = pos_m ) ) THEN zeresp[1] := zeresp[1] + zeresp[2] ; CASE lookup_type OF EMEt : lookup_2nd := EML2 ; HDEt : lookup_2nd := HDL2 ; END ; IF ( ( lookup_type = EMEt ) OR ( lookup_type = HDEt ) ) THEN sum_zeresp ( LOW_ETA_POL := pos_e, HIGH_ETA_POL := neg_e, LOW_ETA_MAG := low_eta, HIGH_ETA_MAG := high_eta, LOW_PHI := low_phi, HIGH_PHI := high_phi, LOOKUP := lookup_2nd, ZERESP := zeresp[2] ) ELSE zeresp[2] := zeresp[1] ; buffer := ' ZER=' + CONVERT(STRING,zeresp[1]) + '/' + CONVERT(STRING,zeresp[2]) + ' T3_CAT3 op#' + CONVERT(STRING,op_num) + ' @ '+ CONVERT(STRING,p_cat3^.cbus) + '/' + CONVERT(STRING,p_cat3^.mba) + '/' + CONVERT(STRING,p_cat3^.ca) + ' ' + CONVERT(STRING(2),lookup_type) + ',POS_NEG,' ; CASE lookup_type OF EMEt, HDEt : buffer := buffer + CONVERT(STRING,eta_cell) + ',P_1_32' ; Px : CASE mom_pol OF pos_m : buffer := buffer + CONVERT(STRING,eta_pair) + ',P_1_8,P_25_32' ; neg_m : buffer := buffer + CONVERT(STRING,eta_pair) + ',P_9_16,P_17_24' ; END ; Py : CASE mom_pol OF pos_m : buffer := buffer + CONVERT(STRING,eta_pair) + ',P_1_8,P_9_16' ; neg_m : buffer := buffer + CONVERT(STRING,eta_pair) + ',P_17_24,P_25_32' ; END ; END ; replymsg[con_served]^.replysupl := CONVERT(STRING(8),data) ; replymsg[con_served]^.replystring := buffer ; handle_trc_inf ( TAG := tag + tagext, MESSAGE := ' T2_CAT2 sum=' + CONVERT(STRING,data) + buffer ) ; quit_tree_eng_t2: END ; { *************************************************************************** } { *************************************************************************** } PROCEDURE tree_eng_t3 ( lookup_type : lookup_data_type ) ; VAR p_imlro :^card_header ; p_register :^cbus_register ; data : INTEGER ; zeresp : INTEGER ; buffer : VARYING_STRING(80) ; BEGIN tagext := inline_tag_ext ; IF ( command_count > 0 ) THEN bad_format ( TAGEXT := tagext, COMMAND := command ) ; IF ( parse_status = parse_failure ) THEN GOTO quit_tree_eng_t3 ; CASE lookup_type OF EMEt, HDEt, Px, Py : p_imlro::^ANYTYPE := ADDRESS(imlro_eng1) ; EML2, HDL2 : p_imlro::^ANYTYPE := ADDRESS(imlro_eng2) ; OTHERWISE handle_trc_err ( TAG := tag + tagext, MESSAGE := ' illegal parameter call to tree_eng_t3' ) ; END ; CASE lookup_type OF EMEt : p_register := ADDRESS(imlro_eng1.EM_Et_eng[first_byte]) ; EML2 : p_register := ADDRESS(imlro_eng2.EM_L2_eng[first_byte]) ; HDEt : p_register := ADDRESS(imlro_eng1.HD_Et_eng[first_byte]) ; HDL2 : p_register := ADDRESS(imlro_eng2.HD_L2_eng[first_byte]) ; Px : p_register := ADDRESS(imlro_eng1.Px_moment[first_byte]) ; Py : p_register := ADDRESS(imlro_eng1.Py_moment[first_byte]) ; END ; examine_multi_byte ( TAGEXT := tagext, CARD := p_imlro, REGISTER := p_register, IOPAR := param, THREE_BYTE_VALUE := data ) ; sign_extend_3_byte_to_4 ( data ) ; CASE lookup_type OF EMEt : zeresp := tree_offset[Global_EMEt] ; EML2 : zeresp := tree_offset[Global_EML2] ; HDEt : zeresp := tree_offset[Global_HDEt] ; HDL2 : zeresp := tree_offset[Global_HDL2] ; Px : zeresp := 0 ; Py : zeresp := 0 ; END ; buffer := ' ZER=' + CONVERT(STRING,zeresp) + ' IMLRO @ ' + CONVERT(STRING,p_imlro^.cbus) + '/' + CONVERT(STRING,p_imlro^.mba) + '/' + CONVERT(STRING,p_imlro^.ca) + '/' + CONVERT(STRING,p_register^.fa+224) + ' ' + CONVERT(STRING,lookup_type) ; replymsg[con_served]^.replysupl := CONVERT(STRING(8),data) ; replymsg[con_served]^.replystring := buffer ; handle_trc_inf ( TAG := tag + tagext, MESSAGE := ' T3_CAT3 sum=' + CONVERT(STRING,data) + buffer ) ; quit_tree_eng_t3: END ; { *************************************************************************** } { *************************************************************************** } PROCEDURE tree_eng_TOT ( lookup_type : lookup_data_topic ) ; VAR p_imlro :^imlro_energy_2_card ; p_register :^cbus_register ; data : INTEGER ; zeresp : INTEGER ; buffer : VARYING_STRING(80) ; BEGIN tagext := inline_tag_ext ; IF ( command_count > 0 ) THEN bad_format ( TAGEXT := tagext, COMMAND := command ) ; IF ( parse_status = parse_failure ) THEN GOTO quit_tree_eng_tot ; CASE lookup_type OF Et, L2 : p_imlro := ADDRESS(imlro_eng2) ; OTHERWISE handle_trc_err ( TAG := tag + tagext, MESSAGE := ' illegal parameter call to tree_eng_tot' ); END ; CASE lookup_type OF Et : p_register := ADDRESS(imlro_eng2.Tot_Et_eng[first_byte]) ; L2 : p_register := ADDRESS(imlro_eng2.Tot_L2_eng[first_byte]) ; END ; examine_multi_byte ( TAGEXT := tagext, CARD := p_imlro, REGISTER := p_register, IOPAR := param, THREE_BYTE_VALUE := data ) ; sign_extend_3_byte_to_4 ( data ) ; CASE lookup_type OF Et : zeresp := tree_offset[Global_TotEt] ; L2 : zeresp := tree_offset[Global_TotL2] ; END ; buffer := ' ZER=' + CONVERT(STRING,zeresp) + ' IMLRO @ ' + CONVERT(STRING,p_imlro^.cbus) + '/' + CONVERT(STRING,p_imlro^.mba) + '/' + CONVERT(STRING,p_imlro^.ca) + '/' + CONVERT(STRING,p_register^.fa+224) + ' Tot ' + CONVERT(STRING,lookup_type) ; replymsg[con_served]^.replysupl := CONVERT(STRING(8),data) ; replymsg[con_served]^.replystring := buffer ; handle_trc_inf ( TAG := tag + tagext, MESSAGE := ' T4_CAT3 sum=' + CONVERT(STRING,data) + buffer ) ; quit_tree_eng_tot: END ; { *************************************************************************** } { *************************************************************************** } PROCEDURE tree_mispt ; VAR p_imlro :^imlro_caltrig_aux ; p_register :^cbus_register ; data : byte ; zeresp : INTEGER ; buffer : VARYING_STRING(80) ; BEGIN tagext := inline_tag_ext ; IF ( command_count > 0 ) THEN bad_format ( TAGEXT := tagext, COMMAND := command ) ; IF ( parse_status = parse_failure ) THEN GOTO quit_tree_mpt ; p_imlro := ADDRESS(imlro_ct_aux) ; p_register := ADDRESS(imlro_ct_aux.Miss_Pt) ; examine_register ( TAGEXT := tagext, CARD := p_imlro, REGISTER := p_register, IOPAR := param, DATA := data ) ; zeresp := 0 ; buffer := ' ZER=' + CONVERT(STRING,zeresp) + ' IMLRO @ ' + CONVERT(STRING,p_imlro^.cbus) + '/' + CONVERT(STRING,p_imlro^.mba) + '/' + CONVERT(STRING,p_imlro^.ca) + '/' + CONVERT(STRING,p_register^.fa+224) + ' Missing Pt ' ; replymsg[con_served]^.replysupl := CONVERT(STRING(8),data) ; replymsg[con_served]^.replystring := buffer ; handle_trc_inf ( TAG := tag + tagext, MESSAGE := ' FMLN sum=' + CONVERT(STRING,data) + buffer ) ; quit_tree_mpt: END ; { *************************************************************************** } { *************************************************************************** } PROCEDURE tree_cnt_twr ( cmp_typ : threshold_comparison_type ) ; VAR eta_pol : eta_polarity ; eta_mag : eta_magnitude ; phi_val : phi_value ; ref_num : threshold_reference_set_number ; eta_cell : magn_eta_per_fe_cell ; rel_eta : relative_eta ; rel_phi : relative_phi ; phi_quad : phi_per_fe_half_cell ; p_chtcr_input :^chtcr_card_low_half ; p_register :^cbus_register ; data : byte ; bit_num : byte ; cmp_result : BOOLEAN ; mask : byte ; buffer : VARYING_STRING(80) ; BEGIN find_first_tower ( ETA_POL := eta_pol, ETA_MAG := eta_mag, PHI_VAL := phi_val ) ; IF ( parse_status = parse_failure ) THEN GOTO quit_tree_cnt_twr ; IF ( command <> command_count ) THEN bad_format ( TAGEXT := tagext, COMMAND := command ) ; IF ( parse_status = parse_failure ) THEN GOTO quit_tree_cnt_twr ; inline_check_object_keyword ( TAGEXT := tagext, COMMAND := command, KEYWORD := parse_kword_ref ) ; inline_check_max_one_item ( TAGEXT := tagext, COMMAND := command ) ; inline_check_object_has_item ( TAGEXT := tagext, COMMAND := command ) ; CASE cmp_typ OF EMEt_cmp : inline_check_item_in_range ( TAGEXT := tagext, COMMAND := command, LOW := firstemrefset::BYTE, HIGH := lastemrefset::BYTE ) ; TOTEt_cmp : inline_check_item_in_range ( TAGEXT := tagext, COMMAND := command, LOW := firsttotrefset::BYTE, HIGH := lasttotrefset::BYTE ) ; END ; IF ( parse_status = parse_failure ) THEN GOTO quit_tree_cnt_twr ; ref_num := CONVERT( threshold_reference_set_number, parsed_command^[command].itemid ) ; eta_cell := CONVERT ( magn_eta_per_fe_cell, (ORD(eta_mag)-1) DIV 4 ) ; rel_eta := CONVERT ( relative_eta, (ORD(eta_mag)-1) MOD 4 ) ; phi_quad := CONVERT ( phi_per_fe_half_cell, ( (ORD(phi_val)-1) DIV 8 ) ) ; rel_phi := CONVERT ( relative_phi, ( (ORD(phi_val)-1) MOD 8 ) ) ; p_chtcr_input := ADDRESS ( chtcr_inputs[eta_pol,eta_cell,phi_quad] ) ; p_register := ADDRESS(p_chtcr_input^.inmskreg[cmp_typ,ref_num,rel_eta]) ; CASE cmp_typ OF EMEt_cmp : CASE rel_phi OF relp_0 : bit_num := 8 ; relp_1 : bit_num := 7 ; relp_2 : bit_num := 6 ; relp_3 : bit_num := 5 ; relp_4 : bit_num := 4 ; relp_5 : bit_num := 3 ; relp_6 : bit_num := 2 ; relp_7 : bit_num := 1 ; END; TOTEt_cmp : CASE rel_phi OF relp_0 : bit_num := 1 ; relp_1 : bit_num := 2 ; relp_2 : bit_num := 3 ; relp_3 : bit_num := 4 ; relp_4 : bit_num := 5 ; relp_5 : bit_num := 6 ; relp_6 : bit_num := 7 ; relp_7 : bit_num := 8 ; END; OTHERWISE handle_trc_err ( TAG := tag + tagext, MESSAGE := ' illegal parameter call to tree_cnt_twr') ; END ; CASE bit_num OF 1 : mask := 1 ; 2 : mask := 2 ; 3 : mask := 4 ; 4 : mask := 8 ; 5 : mask := 16 ; 6 : mask := 32 ; 7 : mask := 64 ; 8 : mask := 128 ; END; examine_register ( TAGEXT := tagext, CARD := p_chtcr_input, REGISTER := p_register, IOPAR := param, DATA := data ) ; IF ( inline_byte_and ( data, mask ) <> 0 ) THEN cmp_result := TRUE ELSE cmp_result := FALSE ; buffer := ' Pattern=' + BIN(data,8,8) + ' CHTCR @ ' + CONVERT(STRING,p_chtcr_input^.cbus) + '/' + CONVERT(STRING,p_chtcr_input^.mba) + '/' + CONVERT(STRING,p_chtcr_input^.ca) + '/' + CONVERT(STRING,p_register^.fa+224) + '-' + CONVERT(STRING,bit_num) + ' ' + CONVERT(STRING,cmp_typ) + ',' + CONVERT(STRING,ref_num) + ',' + CONVERT(STRING(3),eta_pol) + ',' + CONVERT(STRING,eta_mag) + ',' + CONVERT(STRING,phi_val) ; replymsg[con_served]^.replysupl := CONVERT(STRING(8),cmp_result) ; replymsg[con_served]^.replystring := buffer ; handle_trc_inf ( TAG := tag + tagext, MESSAGE := ' Tower=' + CONVERT(STRING,cmp_result) + buffer ) ; quit_tree_cnt_twr: END ; { *************************************************************************** } { *************************************************************************** } PROCEDURE tree_cnt_t1 ( cmp_typ : threshold_comparison_type ) ; VAR eta_pol : eta_polarity ; eta_mag : eta_magnitude ; phi_val : phi_value ; ref_num : threshold_reference_set_number ; eta_cell : magn_eta_per_fe_cell ; phi_quad : phi_per_fe_half_cell ; phi_half : phi_per_fe_cell ; p_cat2 :^cat2_card ; op_num : INTEGER; data : INTEGER ; buffer : VARYING_STRING(80) ; BEGIN find_first_tower ( ETA_POL := eta_pol, ETA_MAG := eta_mag, PHI_VAL := phi_val ) ; IF ( parse_status = parse_failure ) THEN GOTO quit_tree_cnt_t1 ; IF ( command <> command_count ) THEN bad_format ( TAGEXT := tagext, COMMAND := command ) ; IF ( parse_status = parse_failure ) THEN GOTO quit_tree_cnt_t1 ; inline_check_object_keyword ( TAGEXT := tagext, COMMAND := command, KEYWORD := parse_kword_ref ) ; inline_check_max_one_item ( TAGEXT := tagext, COMMAND := command ) ; inline_check_object_has_item ( TAGEXT := tagext, COMMAND := command ) ; CASE cmp_typ OF EMEt_cmp : inline_check_item_in_range ( TAGEXT := tagext, COMMAND := command, LOW := firstemrefset::BYTE, HIGH := lastemrefset::BYTE ) ; TOTEt_cmp : inline_check_item_in_range ( TAGEXT := tagext, COMMAND := command, LOW := firsttotrefset::BYTE, HIGH := lasttotrefset::BYTE ) ; END ; IF ( parse_status = parse_failure ) THEN GOTO quit_tree_cnt_t1 ; ref_num := CONVERT( threshold_reference_set_number, parsed_command^[command].itemid ) ; eta_cell := CONVERT ( magn_eta_per_fe_cell, (ORD(eta_mag)-1) DIV 4 ) ; phi_quad := CONVERT ( phi_per_fe_half_cell, (ORD(phi_val)-1) DIV 8 ) ; phi_half := CONVERT ( phi_per_fe_cell, (ORD(phi_val)-1) DIV 16) ; CASE cmp_typ OF EMEt_cmp : p_cat2 := ADDRESS(cat2_EMC_t2[ref_num,eta_cell]) ; TotEt_cmp : p_cat2 := ADDRESS(cat2_TOTc_t2[ref_num,eta_cell]) ; OTHERWISE handle_trc_err ( TAG := tag + tagext, MESSAGE := ' illegal parameter call to tree_cnt_t1' ) ; END ; op_num := 1 + 2 * ORD(phi_quad) + ORD(eta_pol) ; examine_cat2_operand ( TAGEXT := tagext, CARD := p_cat2, OP_NUM := op_num, OP_VALUE := data, IOPAR := param ) ; buffer := ' T2_CAT2 op#' + CONVERT(STRING,op_num) + ' @ '+ CONVERT(STRING,p_cat2^.cbus) + '/' + CONVERT(STRING,p_cat2^.mba) + '/' + CONVERT(STRING,p_cat2^.ca) + '/' + CONVERT(STRING,p_cat2^.inopreg[op_num,bit_0_5].fa) + ' ' + CONVERT(STRING,cmp_typ) + ',' + CONVERT(STRING,ref_num) + ',' + CONVERT(STRING(3),eta_pol) + ',' + CONVERT(STRING,eta_cell) + ',' + CONVERT(STRING,phi_quad) ; replymsg[con_served]^.replysupl := CONVERT(STRING(8),data) ; replymsg[con_served]^.replystring := buffer ; handle_trc_inf ( TAG := tag + tagext, MESSAGE := ' T1_CAT2 cnt=' + CONVERT(STRING,data) + buffer ) ; quit_tree_cnt_t1: END ; { *************************************************************************** } { *************************************************************************** } PROCEDURE tree_cnt_t2 ( cmp_typ : threshold_comparison_type ) ; VAR eta_pol : eta_polarity ; eta_mag : eta_magnitude ; phi_val : phi_value ; eta_cell : magn_eta_per_fe_cell ; ref_num : threshold_reference_set_number ; eta_pair : eta_per_rack_pair ; phi_quad : phi_per_fe_half_cell ; p_cat2 :^cat2_card ; op_num : INTEGER; data : INTEGER ; buffer : VARYING_STRING(80) ; BEGIN find_first_tower ( ETA_POL := eta_pol, ETA_MAG := eta_mag, PHI_VAL := phi_val ) ; IF ( parse_status = parse_failure ) THEN GOTO quit_tree_cnt_t2 ; IF ( command <> command_count ) THEN bad_format ( TAGEXT := tagext, COMMAND := command ) ; IF ( parse_status = parse_failure ) THEN GOTO quit_tree_cnt_t2 ; inline_check_object_keyword ( TAGEXT := tagext, COMMAND := command, KEYWORD := parse_kword_ref ) ; inline_check_max_one_item ( TAGEXT := tagext, COMMAND := command ) ; inline_check_object_has_item ( TAGEXT := tagext, COMMAND := command ) ; CASE cmp_typ OF EMEt_cmp : inline_check_item_in_range ( TAGEXT := tagext, COMMAND := command, LOW := firstemrefset::BYTE, HIGH := lastemrefset::BYTE ) ; TOTEt_cmp : inline_check_item_in_range ( TAGEXT := tagext, COMMAND := command, LOW := firsttotrefset::BYTE, HIGH := lasttotrefset::BYTE ) ; END ; IF ( parse_status = parse_failure ) THEN GOTO quit_tree_cnt_t2 ; ref_num := CONVERT( threshold_reference_set_number, parsed_command^[command].itemid ) ; eta_cell := CONVERT ( magn_eta_per_fe_cell, (ORD(eta_mag)-1) DIV 4 ) ; eta_pair := CONVERT ( eta_per_rack_pair, (ORD(eta_mag)-1) DIV 8 ) ; phi_quad := CONVERT ( phi_per_fe_half_cell, (ORD(phi_val)-1) DIV 8 ) ; CASE cmp_typ OF EMEt_cmp : p_cat2 := ADDRESS(cat2_EM_cnt_t3[ref_num]) ; TOTEt_cmp : p_cat2 := ADDRESS(cat2_TOT_cnt_t3[ref_num]) ; OTHERWISE handle_trc_err ( TAG := tag + tagext, MESSAGE := ' illegal parameter call to tree_cnt_t2' ) ; END ; op_num := 1 + ORD(eta_cell) ; examine_cat2_operand ( TAGEXT := tagext, CARD := p_cat2, OP_NUM := op_num, OP_VALUE := data, IOPAR := param ) ; buffer := ' T3_CAT2 op#' + CONVERT(STRING,op_num) + ' @ '+ CONVERT(STRING,p_cat2^.cbus) + '/' + CONVERT(STRING,p_cat2^.mba) + '/' + CONVERT(STRING,p_cat2^.ca) + '/' + CONVERT(STRING,p_cat2^.inopreg[op_num,bit_0_5].fa) + ' ' + CONVERT(STRING,cmp_typ) + ',' + CONVERT(STRING,ref_num) + ',POS_NEG,' + CONVERT(STRING,eta_cell) + ',P_1_32' ; replymsg[con_served]^.replysupl := CONVERT(STRING(8),data) ; replymsg[con_served]^.replystring := buffer ; handle_trc_inf ( TAG := tag + tagext, MESSAGE := ' T2_CAT2 cnt=' + CONVERT(STRING,data) + buffer ) ; quit_tree_cnt_t2: END ; { *************************************************************************** } { *************************************************************************** } PROCEDURE tree_cnt_t3 ( cmp_typ : threshold_comparison_type ) ; VAR ref_num : threshold_reference_set_number ; p_imlro :^imlro_tower_counts_card ; p_register :^cbus_register ; data : INTEGER ; buffer : VARYING_STRING(80) ; BEGIN tagext := inline_tag_ext ; IF ( command_count <> 1 ) THEN bad_format ( TAGEXT := tagext ) ; IF ( parse_status = parse_failure ) THEN GOTO quit_tree_cnt_t3 ; inline_check_object_keyword ( TAGEXT := tagext, COMMAND := 1, KEYWORD := parse_kword_ref ) ; inline_check_max_one_item ( TAGEXT := tagext, COMMAND := 1 ) ; inline_check_object_has_item ( TAGEXT := tagext, COMMAND := 1 ) ; CASE cmp_typ OF EMEt_cmp : inline_check_item_in_range ( TAGEXT := tagext, COMMAND := 1, LOW := firstemrefset::BYTE, HIGH := lastemrefset::BYTE ) ; TOTEt_cmp : inline_check_item_in_range ( TAGEXT := tagext, COMMAND := 1, LOW := firsttotrefset::BYTE, HIGH := lasttotrefset::BYTE ) ; END ; IF ( parse_status = parse_failure ) THEN GOTO quit_tree_cnt_t3 ; ref_num := CONVERT( threshold_reference_set_number, parsed_command^[1].itemid ) ; p_imlro::^ANYTYPE := ADDRESS(imlro_cnts) ; CASE cmp_typ OF EMEt_cmp : p_register := ADDRESS(imlro_cnts.EM_Et_cnt[ref_num,first_byte]) ; TotEt_cmp : p_register := ADDRESS(imlro_cnts.Tot_Et_cnt[ref_num,first_byte]) ; OTHERWISE handle_trc_err ( TAG := tag + tagext, MESSAGE := ' illegal parameter call to tree_cnt_t3' ) ; END ; examine_multi_byte ( TAGEXT := tagext, CARD := p_imlro, REGISTER := p_register, IOPAR := param, TWO_BYTE_VALUE := data ) ; buffer := ' IMLRO @ ' + CONVERT(STRING,p_imlro^.cbus) + '/' + CONVERT(STRING,p_imlro^.mba) + '/' + CONVERT(STRING,p_imlro^.ca) + '/' + CONVERT(STRING,p_register^.fa+224) + ' ' + CONVERT(STRING,cmp_typ) + ',' + CONVERT(STRING,ref_num) ; replymsg[con_served]^.replysupl := CONVERT(STRING(8),data) ; replymsg[con_served]^.replystring := buffer ; handle_trc_inf ( TAG := tag + tagext, MESSAGE := ' T3_CAT2 cnt=' + CONVERT(STRING,data) + buffer ) ; quit_tree_cnt_t3: END ; { *************************************************************************** } { *************************************************************************** } PROCEDURE find_first_tower ( VAR eta_pol : eta_polarity ; VAR eta_mag : eta_magnitude ; VAR phi_val : phi_value ) ; VAR eta_sign_range : SET OF eta_polarity ; eta_magn_range : SET OF eta_magnitude ; phi_range : SET OF phi_value ; pol_eta : eta_polarity ; mag_eta : eta_magnitude ; val_phi : phi_value ; BEGIN IF ( parse_status = parse_failure ) THEN GOTO quit_find_first_tower ; eta_sign_range := [firstetasign,lastetasign] ; eta_magn_range := [firstetamagn..lastetamagn] ; phi_range := [firstphival..lastphival] ; command := 1 ; { *** tag passed along to label screen messages } tagext := inline_tag_ext ; { *** parse tower coordinate keywords and ranges } find_and_check_ranges ( TAGEXT := tagext, COMMAND := command, ETA_SIGN_RANGE := eta_sign_range, ETA_MAGN_RANGE := eta_magn_range, PHI_RANGE := phi_range ) ; IF ( parse_status = parse_failure ) THEN GOTO quit_find_first_tower ; { *** no action taken in case of bad parse status } IF ( parse_status = parse_failure ) THEN GOTO quit_find_first_tower ; FOR pol_eta := firstetasign TO lastetasign DO FOR mag_eta := firstetamagn TO lastetamagn DO FOR val_phi := firstphival TO lastphival DO IF ( inline_check_tower_in_range ( ETA_POL := pol_eta, ETA_MAG := mag_eta, PHI_VAL := val_phi, ETA_SIGN_RANGE := eta_sign_range, ETA_MAGN_RANGE := eta_magn_range, PHI_RANGE := phi_range ) = TRUE ) THEN GOTO first_tower_found ; {exit do loop} first_tower_found : eta_pol := pol_eta ; eta_mag := mag_eta ; phi_val := val_phi ; quit_find_first_tower : END ; { *************************************************************************** } { *************************************************************************** } [INLINE] PROCEDURE sign_extend_3_byte_to_4 ( VAR data : INTEGER ) ; TYPE integer_by_fields = [LONG] PACKED RECORD low_23bits : [POS( 0)] 0..8388607 ; bit_24 : [POS(23)] 0..1 ; high_8bits : [POS(24)] 0..255 ; END ; VAR temp : integer_by_fields ; BEGIN temp::INTEGER := data ; IF ( temp.bit_24 = 1 ) THEN temp.high_8bits := 255 ; data := temp::INTEGER ; END ; { *************************************************************************** } { *************************************************************************** } [INLINE] FUNCTION inline_tag_ext : VARYING_STRING(8) ; BEGIN { *** tag passed along to label screen messages } inline_tag_ext := 'C' + SUBSTR (reqstmsg[con_served]^.reqstid, 7, 2) + '/' + CONVERT (STRING,command) + ':' ; END ; { *************************************************************************** } [INLINE] FUNCTION inline_check_tower_in_range ( eta_pol : eta_polarity ; eta_mag : eta_magnitude ; phi_val : phi_value ; eta_sign_range : SET_OF_eta_polarity ; eta_magn_range : SET_OF_eta_magnitude ; phi_range : SET_OF_phi_value ) : BOOLEAN ; BEGIN inline_check_tower_in_range := ( eta_pol IN eta_sign_range ) AND ( eta_mag IN eta_magn_range ) AND ( phi_val IN phi_range ) END ; { *************************************************************************** } { *************************************************************************** } [INLINE] FUNCTION inline_byte_and ( op1 , op2 : byte ) : byte ; VAR bool1, bool2, bool3 : BOOLEAN ; BEGIN bool1::BYTE_DATA := op1::BYTE_DATA ; bool2::BYTE_DATA := op2::BYTE_DATA ; bool3 := bool1 AND bool2 ; inline_byte_and::BYTE_DATA := bool3::BYTE_DATA ; END ; { *************************************************************************** } END.