From: Jan Michel Date: Wed, 12 Oct 2022 10:28:45 +0000 (+0200) Subject: Start library with important conversion / lookup functions X-Git-Url: https://jspc29.x-matter.uni-frankfurt.de/git/?a=commitdiff_plain;h=56c6648eeb156396f5037921de8f6758c7da0b88;p=hades_mdc_settings.git Start library with important conversion / lookup functions --- diff --git a/installation/powerdistributor_positions.db b/installation/powerdistributor_positions.db index 3c9dcad..73bf0f6 100644 --- a/installation/powerdistributor_positions.db +++ b/installation/powerdistributor_positions.db @@ -1,4 +1,5 @@ #List of Positions of Power Distributor boards +#hostnames are mdcpd000 # Plane # Sector # Serial ################################### diff --git a/scripts/MDC.pm b/scripts/MDC.pm new file mode 100644 index 0000000..40d401e --- /dev/null +++ b/scripts/MDC.pm @@ -0,0 +1,105 @@ +package MDC; + +use warnings; +no warnings "portable"; +use FileHandle; +use Getopt::Long; +use Data::Dumper; + + +############################################################################### +#returns address of chip at (plane,sector,board,fpga) +#fpga = 5 for OEP, 0..2 for TDC +#all counting from 0 +############################################################################### +sub get_address { + my ($p,$s,$b,$e) = @_; + + if($e == 5) { + return 0x8000 + ($p<2?0x0e00:0x0f00) + ($p%2 ? $s*16+96 : $s*16) + $b; + } + else { + return ($p<2?0x1000:0x2000) + ($p%2 ? $s*256+6*256 : $s*256) + $b*16 + $e; + } + } + +############################################################################### +#returns the position of chip with (address) as (plane,sector,board,fpga) +#all counting from 0 +############################################################################### +sub get_position { + my $addr = shift @_; + my ($p,$s,$b,$e); + + if($addr > 0x8000) { + $e = 5; + $b = $addr & 0xf; + $s = (($addr>>4)&0xf)%6; + $p = (($addr>>8)==0x8e)?0:2; + $p += 1 if (($addr>>4)&0xf)>=6; + } + else { + $e = $addr & 0x3; + $b = ($addr>>4) & 0xf; + $s = (($addr>>8)&0xf)%6; + $p = (($addr>>12)==0x01)?0:2; + $p += 1 if (($addr>>8)&0xf)>=6; + } + return ($p,$s,$b,$e); + } + +############################################################################### +#get the correct power channel for board with (address). +#returns (hostname,board,output) +############################################################################### +sub get_power_channel { + my $addr = shift @_; + my ($p,$s,$b,$e) = get_position($addr); + my $id=-1; + + open FILE, "../installation/powerdistributor_positions.db" or die $!."\npowerdistributor_positions.db not found."; + while (my $a = ) { + if(my @values = $a =~ /^\s*(\d)\s+(\d)\s+(\d+)/) { + my $pd_p = shift @values; + my $pd_s = shift @values; + $id = int(shift @values); + last if $p == $pd_p && $s == $pd_s; + } + } + close FILE; + + my $hostname = sprintf("mdcpd%03x",$id); + $hostname = -1 if $id==-1; + return($hostname,int($b/4),$b%4); + } + +1; + + +__END__ + + +############################################################################### +#Addressing scheme +############################################################################### + + OEP FPGA: + + 1 digit: 8 (as for all hubs) + 2 digit: e/f (inner/outer MDC) + 3 digit: 0..b (chamber number, 0..5 for MDC1/3 6..B for MDC2/4) + 4 digit: 0..f (MBO number) + +TDC FPGA: + + 1 digit: 1/2 (inner/outer MDC) + 2 digit: 0..b (chamber number, 0..5 for MDC1/3 6..B for MDC2/4) + 3 digit: 0..f (MBO number) + 4 digit: 0..2 (FPGA number) + +Hub FPGA: + + 1 digit: 8 (as for all hubs) + 2 digit: 5 + 3 digit: 0..b (crate number, 0..5 inner MDC, 6..b outer MDC sectors) + 4 digit FPGA number in crate (0:master & Subevent ID) diff --git a/scripts/generate_address_list.pl b/scripts/generate_address_list.pl index 431c675..447fcb0 100755 --- a/scripts/generate_address_list.pl +++ b/scripts/generate_address_list.pl @@ -4,6 +4,8 @@ no warnings "portable"; use FileHandle; use Getopt::Long; use Data::Dumper; +use lib '.'; +use MDC; my $DEBUG = 0; #print debug messages @@ -44,17 +46,18 @@ foreach my $p (0..3) { my $str; - my $addr = 0x8000 + ($p<2?0x0e00:0x0f00) + ($p%2 ? $s*16+96 : $s*16) + $b; + my $addr; + $addr = MDC::get_address($p,$s,$b,5); $str .= sprintf(" 0x%04x %03i %i\n",$addr,$boards->[$p][$s][$b],5); - $addr = ($p<2?0x1000:0x2000) + ($p%2 ? $s*256+6*256 : $s*256) + $b*16 + 0; + $addr = MDC::get_address($p,$s,$b,0); $str .= sprintf(" 0x%04x %03i %i\n",$addr,$boards->[$p][$s][$b],0); - $addr = ($p<2?0x1000:0x2000) + ($p%2 ? $s*256+6*256 : $s*256) + $b*16 + 1; + $addr = MDC::get_address($p,$s,$b,1); $str .= sprintf(" 0x%04x %03i %i\n",$addr,$boards->[$p][$s][$b],1); if($longs->[$p][$s][$b]) { - $addr = ($p<2?0x1000:0x2000) + ($p%2 ? $s*256+6*256 : $s*256) + $b*16 + 2; + $addr = MDC::get_address($p,$s,$b,2); $str .= sprintf(" 0x%04x %03i %i\n",$addr,$boards->[$p][$s][$b],2); }; @@ -70,29 +73,3 @@ close FILE; __END__ - - -############################################################################### -#Addressing scheme -############################################################################### - - OEP FPGA: - - 1 digit: 8 (as for all hubs) - 2 digit: e/f (inner/outer MDC) - 3 digit: 0..b (chamber number, 0..5 for MDC1/3 6..B for MDC2/4) - 4 digit: 0..f (MBO number) - -TDC FPGA: - - 1 digit: 1/2 (inner/outer MDC) - 2 digit: 0..b (chamber number, 0..5 for MDC1/3 6..B for MDC2/4) - 3 digit: 0..f (MBO number) - 4 digit: 0..2 (FPGA number) - -Hub FPGA: - - 1 digit: 8 (as for all hubs) - 2 digit: 5 - 3 digit: 0..b (crate number, 0..5 inner MDC, 6..b outer MDC sectors) - 4 digit FPGA number in crate (0:master & Subevent ID)