;############################################################################## ;# ;# Test Program for nonlinearity filter. ;# ;# Input data is taken from event buffer and stored back there in ;# another memory region. ;# ;# Marcus Gutfleisch ;# Ruprecht-Karls-Universität Heidelberg, Kirchhoff-Institut für Physik ;# ;# Heidelberg, 18.03.2005 ;# ;############################################################################## #inc #inc ../../assembler.inc ;###################################################################### ;# ;# defines ;# ;###################################################################### #def CPU_SYNC = g0 #def ERROR_CTR = c8 #def OFFSET_CTR = c12 #def AL_CTR = c13 #def OFFSET_ADR = 0xC04 #def AL_ADR = 0xC05 #ifdef cpu0 #def ERROR_ADR = 0xC00 #endif #ifdef cpu1 #def ERROR_ADR = 0xC08 #endif #ifdef cpu2 #def ERROR_ADR = 0xC10 #endif #ifdef cpu3 #def ERROR_ADR = 0xC18 #endif ;###################################################################### ;# ;# 0x0000: Infinite Loop at Instruction Memory Reset Address ;# ;###################################################################### org 0x0000 jmpr cc_uncond, 0 nop ;###################################################################### ;# ;# 0x0010: Interrrupt Clear Jump Address ;# ;# CPU0: switch off all NI LVDS cells ;# switch off NI clock ;# switch off preprocessor clock ;# switch on filter clock ;# ;# CPU1: end clear state, arm state machine ;# ;# CPU2: get tracklet end signature (???) ;# ;# CPU3: get data end signature (???) ;# ;###################################################################### org 0x0010 mov 0, r12 mov 4, r13 #ifdef cpu0 mov 0, r0 iext EBD mov EBD, r1 jmpr cc_busy, 0 sgio r0, r1 mov 0, CPU_SYNC mov CMD_EXT_CLR, r0 mov CMD_PRETRIGG, r1 mov 1024, r2 jmpr cc_busy, 0 cmp r2, OFFSET_CTR jmp cc_leu, end_lp sgio r0, SMCMD nop nop sgio r1, SMCMD #else #ifdef MCM #ifdef cpu1 mov 0, r0 iext SEBDOU sgio r0, SEBDOU #else nop nop nop #endif #endif ; nop ; nop ; ; nop ; ; nop ; nop ; nop ; nop ; nop ; nop ; nop ; ; nop ; nop ; nop #endif end_cl: jmpr cc_uncond, 0 nop end_lp: #ifdef MCM mov 5, r0 iext SEBDEN sgio r0, SEBDEN #else mov CMD_LP, r0 sgio r0, SMCMD nop #endif jmpr cc_uncond, 0 mov CMD_LP, r0 sgio r0, SMCMD jmpr cc_uncond, 0 nop ;###################################################################### ;# ;# 0x0100: Interrrupt Tracklet Processing Jump Address ;# ;# send delayed tracklet end marker ;# ;###################################################################### org 0x0100 #ifdef cpu0 mov 6, r0 iext EBD mov EBD, r1 jmpr cc_busy, 0 sgio r0, r1 #endif #ifdef cpu1 nop nop nop nop nop #endif #ifdef cpu2 nop nop nop nop nop #endif #ifdef cpu3 mov 1, r0 iext EBSIM mov EBSIM, r1 jmpr cc_busy, 0 sgio r0, r1 #endif ;############################################################## ;# ;# check result ;# ;############################################################## mov EBR0, r8 ; load channel specific address offset add r8, c1, r8 ; add +1 due to shifted response mov EBR1, r9 add r9, c1, r9 mov EBR2, r10 add r10, c1, r10 mov EBR3, r11 add r11, c1, r11 mov EBR4, r12 add r12, c1, r12 mov EBR5, r13 add r13, c1, r13 mov 0, r0 ; r0: time bin number in loopTT mov 0, r14 ; r14: slow exponential register mov 0, r15 ; r15: fast exponential register mov AL_CTR, r7 ; r7: current FTAL entry mov 0x600, r1 ; r1: current slow decay parameter mov 0x200, r2 ; r2: current fast decay parameter loopTT: mov 0, r6 ; r6: error counter for current time bin ;###################################################### ;# ;# calculate expected value ;# ;###################################################### mov 31, r3 add r8, r3, r3 ; source offset address add r0, r3, r3 ; source address lpio r3, r5 lpio r3, r5 ; input data word shl 2, r5, r3 ; r3: expected input (10+2 Bit) add r14, r15, r4 ; r4: correction value cmp r4, 0xFFF jmp cc_leu, TTo0 mov 0xFFF, r4 TTo0: sub r3, r4, r3 ; r3: expeced output (10+2 Bit) jmp cc_gtu, TTo1 mov 0, r3 TTo1: mul32 r7, r3, r4 ; r4: weighted input to exp unit (slow) nop ; r5: stimulus + old register (slow) shl -11, r4, r4 add r4, r14, r5 cmp r5, 0xFFF jmp cc_leu, TTo2 mov 0xFFF, r5 TTo2: mul32 r5, r1, r5 ; r14: update slow exponential register nop shl -11, r5, r14 sub r3, r4, r4 ; r4: weighted input to exp unit (fast) add r4, r15, r5 ; r5: stimulus + old register (fast) cmp r5, 0xFFF jmp cc_leu, TTo3 mov 0xFFF, r5 TTo3: mul32 r5, r2, r5 ; r14: update fast exponential register nop shl -11, r5, r15 shl -2, r3, r3 ; -> (10+0 Bit) ;###################################################### ;# ;# check value ;# ;###################################################### TTc0: add r0, r8, r4 ; r4: event buffer address (CH00) lpio r4, r5 lpio r4, r5 ; r5: filter result cmp r3, r5 jmp cc_eq, TTc1 add r6, c1, r6 TTc1: add r0, r9, r4 ; r4: event buffer address (CH01) lpio r4, r5 lpio r4, r5 ; r5: filter result cmp r3, r5 jmp cc_eq, TTc2 add r6, c1, r6 TTc2: add r0, r10, r4 ; r4: event buffer address (CH02) lpio r4, r5 lpio r4, r5 ; r5: filter result cmp r3, r5 jmp cc_eq, TTc3 add r6, c1, r6 TTc3: add r0, r11, r4 ; r4: event buffer address (CH03) lpio r4, r5 lpio r4, r5 ; r5: filter result cmp r3, r5 jmp cc_eq, TTc4 add r6, c1, r6 TTc4: add r0, r12, r4 ; r4: event buffer address (CH04) lpio r4, r5 lpio r4, r5 ; r5: filter result cmp r3, r5 jmp cc_eq, TTc5 add r6, c1, r6 #ifdef cpu3 TTc5: add r0, r13, r4 ; r4: event buffer address (CH05) lpio r4, r5 lpio r4, r5 ; r5: filter result cmp r3, r5 jmp cc_eq, TTend add r6, c1, r6 #else nop nop nop nop nop TTc5: nop #endif TTend: add r6, ERROR_CTR, r6 jmpr cc_busy, 0 sgio r6, ERROR_ADR add r0, c1, r0 cmp r0, 31 jmp cc_ltu, loopTT nop ;############################################################## ;# ;# increase counters ;# ;############################################################## #ifdef cpu3 mov 1, r1 add r1, AL_CTR, r0 cmp r0, 1024 jmp cc_ltu, ct_LUT mov 0, r0 mov 256, r1 add r1, OFFSET_CTR, r1 jmpr cc_busy, 0 sgio r1, OFFSET_ADR ct_LUT: jmpr cc_busy, 0 sgio r0, AL_ADR #else nop nop nop nop nop nop nop nop nop nop nop #endif jmpr cc_busy, 0 ;############################################################## ;# ;# write next LUT test entries ;# ;############################################################## mov AL_CTR, r12 ; r12: next FTAL entry iext FTAL mov FTAL, r0 jmpr cc_busy, 0 sgio r12, r0 ;############################################################## ;# ;# write next test pattern into event buffer ;# ;############################################################## #ifdef cpu3 mov 0, r0 cmp r0, AL_CTR jmp cc_neq, endEB iext EBW mov EBW, r0 mov 32, r1 add r0, r1, r0 ; r0: event buffer write offset address mov EBR5, r6 add r6, r1, r6 ; r6: event buffer read offset address mov 256, r7 ; data value increment mov 0, r1 ; r1: channel number in loopEB mov 1, r2 ; r2: time bin number in loopEB loopEB: add r6, r2, r8 ; r8: single read address lpio r8, r4 lpio r8, r4 ; r4: old content add r7, r4, r4 ; r4: new content (incremented) shl 7, r1, r3 add r0, r3, r3 add r2, r3, r3 jmpr cc_busy, 0 ; r3: single write address sgio r4, r3 ; r4: data to write mov 10, r5 waitD: sub r5, c1, r5 jmp cc_gts, waitD add r1, c1, r1 cmp r1, 21 jmp cc_ltu, loopEB mov 0, r1 add r2, c1, r2 cmp r2, 32 jmp cc_ltu, loopEB nop endEB: mov 1, CPU_SYNC #else nop #endif ;############################################################## ;# ;# wait for data writing completion ;# ;############################################################## wsy: mov CPU_SYNC, r0 cmp r0, 1 jmp cc_neq, wsy ;############################################################## ;# ;# copy lower indicator words ;# ;############################################################## #ifdef cpu0 mov 0x7B8, r15 #endif #ifdef cpu1 mov 0x7CC, r15 #endif #ifdef cpu2 mov 0x7E0, r15 #endif #ifdef cpu3 mov 0x7F4, r15 #endif lpio EBI0, r0 lpio EBI0, r0 sra+ r0 lpio EBI2, r0 lpio EBI2, r0 sra+ r0 lpio EBI4, r0 lpio EBI4, r0 sra+ r0 lpio EBI6, r0 lpio EBI6, r0 sra+ r0 lpio EBI8, r0 lpio EBI8, r0 sra+ r0 #ifdef cpu3 lpio EBIA, r0 lpio EBIA, r0 sra+ r0 #else nop nop nop #endif ;############################################################## ;# ;# DMEM address to copy event buffer data to ;# beware: byte address = 4 * word address ;# ;############################################################## #ifdef cpu0 mov 0x080, r15 #endif #ifdef cpu1 mov 0x238, r15 #endif #ifdef cpu2 mov 0x3F0, r15 #endif #ifdef cpu3 mov 0x5A8, r15 #endif ;############################################################## ;# ;# channel check bits, absolute channel number ;# ;############################################################## #ifdef cpu0 mov 3, r3 #endif #ifdef cpu1 mov 2, r3 #endif #ifdef cpu2 mov 3, r3 #endif #ifdef cpu3 mov 2, r3 #endif ;############################################################## ;# ;# copy event buffer data of CPU's channel 0 ;# ;############################################################## mov EBR0, r14 mov 66, r5 loop0: lpio+ r0 lpio+ r0 lpio+ r1 lpio r14, r2 shl 10, r2, r2 or r1, r2, r2 shl 10, r2, r2 or r0, r2, r2 shl 2, r2, r2 or r3, r2, r2 sra+ r2 sub r5, c3, r5 jmp cc_gtu, loop0 ;############################################################## ;# ;# copy event buffer data of CPU's channel 1 ;# ;############################################################## mov EBR1, r14 mov 66, r5 xor r3, c1, r3 loop1: lpio+ r0 lpio+ r0 lpio+ r1 lpio r14, r2 shl 10, r2, r2 or r1, r2, r2 shl 10, r2, r2 or r0, r2, r2 shl 2, r2, r2 or r3, r2, r2 sra+ r2 sub r5, c3, r5 jmp cc_gtu, loop1 ;############################################################## ;# ;# copy event buffer data of CPU's channel 2 ;# ;############################################################## mov EBR2, r14 mov 66, r5 xor r3, c1, r3 loop2: lpio+ r0 lpio+ r0 lpio+ r1 lpio r14, r2 shl 10, r2, r2 or r1, r2, r2 shl 10, r2, r2 or r0, r2, r2 shl 2, r2, r2 or r3, r2, r2 sra+ r2 sub r5, c3, r5 jmp cc_gtu, loop2 ;############################################################## ;# ;# copy event buffer data of CPU's channel 3 ;# ;############################################################## mov EBR3, r14 mov 66, r5 xor r3, c1, r3 loop3: lpio+ r0 lpio+ r0 lpio+ r1 lpio r14, r2 shl 10, r2, r2 or r1, r2, r2 shl 10, r2, r2 or r0, r2, r2 shl 2, r2, r2 or r3, r2, r2 sra+ r2 sub r5, c3, r5 jmp cc_gtu, loop3 ;############################################################## ;# ;# copy event buffer data of CPU's channel 4 ;# ;############################################################## mov EBR4, r14 mov 66, r5 xor r3, c1, r3 loop4: lpio+ r0 lpio+ r0 lpio+ r1 lpio r14, r2 shl 10, r2, r2 or r1, r2, r2 shl 10, r2, r2 or r0, r2, r2 shl 2, r2, r2 or r3, r2, r2 sra+ r2 sub r5, c3, r5 jmp cc_gtu, loop4 ;############################################################## ;# ;# copy event buffer data of CPU's channel 5 (CPU3 only) ;# ;############################################################## #ifdef cpu3 mov EBR5, r14 mov 66, r5 xor r3, c1, r3 loop5: lpio+ r0 lpio+ r0 lpio+ r1 lpio r14, r2 shl 10, r2, r2 or r1, r2, r2 shl 10, r2, r2 or r0, r2, r2 shl 2, r2, r2 or r3, r2, r2 sra+ r2 sub r5, c3, r5 jmp cc_gtu, loop5 #else nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop #endif ;############################################################## ;# ;# end current state, goto clear state (CPU3 only) ;# ;############################################################## #ifdef cpu3 mov 0, r0 iext EBSIM mov EBSIM, r1 jmpr cc_busy, 0 sgio r0, r1 mov CMD_CLEAR, r0 jmpr cc_busy, 0 sgio r0, SMCMD #else nop nop nop nop nop nop nop nop #endif ;############################################################## ;# ;# switch off own clock after transfer ;# ;############################################################## clkoff: mov 0, r0 jmpr cc_busy, 0 #ifdef cpu0 sgio r0, CPU0SS #endif #ifdef cpu1 sgio r0, CPU1SS #endif #ifdef cpu2 sgio r0, CPU2SS #endif #ifdef cpu3 sgio r0, CPU3SS #endif jmp cc_uncond, clkoff nop ;###################################################################### ;# ;# 0x0300: Interrrupt Raw Data Readout Jump Address ;# ;# Nothing to be done here. ;# ;###################################################################### org 0x300 jmp cc_uncond, clkoff nop