#! /usr/bin/perl -w
use strict;

#########################################
# >./mk_sr1_config.pl [stave-ID] [keyid]
#########################################

##########################################
#my $UNIGE_STAVE_CFG_BASE_DIR = "./cfg";
#my $SR1_STAVE_CFG_BASE_DIR = "./";
#my $UNIGE_STAVE_INFOFILE_DIR = "./";
#my $UNIGE_STAVE_CFG_BASE_DIR = "/users/ytakubo/IBLdata/staves/stave1/cfg";
my $UNIGE_STAVE_CFG_BASE_DIR = "/IBLdata/staves";
#my $UNIGE_STAVE_CFG_BASE_DIR = "/home/ibl/takubo/after-tc_after-tuning130606/";
my $SR1_STAVE_CFG_BASE_DIR = "./SR1_config";
my $UNIGE_STAVE_INFOFILE_DIR = "/IBLdata";
##########################################

my $stave_id = $ARGV[0];
my $keyid = "";
if(@ARGV == 2){ $keyid = $ARGV[1];}

$UNIGE_STAVE_CFG_BASE_DIR = $UNIGE_STAVE_CFG_BASE_DIR."/".$stave_id."/cfg";
my $info_file = $UNIGE_STAVE_INFOFILE_DIR."/".$stave_id."_loading.txt";

my @config_list_for_top_sr1;
my $fepos=0;

open(IN_INFO, $info_file) or die "$!";
for(my $i=0; $i<32+1; $i++){
    $_ = <IN_INFO>;
    if($i>0){
	$fepos++;
	if($fepos >16){ $fepos = 1; }
	my @elements = split;
	my $module_dir_id = $elements[0];
	my $module_pos = $elements[1];
	my $module_id = substr($module_dir_id, 1, length($module_dir_id));

	my @config_list_unige = file_list_unige($module_dir_id, $module_id, $fepos);
	my $unige_config_file = $config_list_unige[0];

	# Read config file for each chip
	my $chip_sn = 0;
	my $chip_sn_6bit = 0;
	open(IN_CONF, $unige_config_file) or die "$!";
	print "Read: ".$unige_config_file."\n";
	while(<IN_CONF>){
	    my @elements_conf = split;
	    if(/Chip_SN/){ $chip_sn = $elements_conf[1]; }
	    $chip_sn_6bit = $chip_sn & 63;
	}
	close IN_CONF;

	my $dir_sr1 = mkdir_sr1($module_pos, $module_id);
	my @config_list_sr1 = file_list_sr1($dir_sr1, $module_id, $chip_sn_6bit); 
	$config_list_for_top_sr1[$i - 1] = $config_list_sr1[0];
	my $sr1_config_file = $config_list_sr1[0];

	open(IN_CONF, $unige_config_file) or die "$!";
	open(OUT_CONF, ">$sr1_config_file") or die "$!";
	while(<IN_CONF>){
	    my @elements_conf = split;
	    my $dir_sr1 = $_;
	    $dir_sr1 =~ s/(?:$module_dir_id)/$module_id/g; 
	    my $fepos_unige = "fe".$fepos;
	    #my $fepos_sr1 = "fe".$chip_sn_6bit;
	    my $fepos_sr1 = $chip_sn_6bit;
	    $dir_sr1 =~ s/(?:$fepos_unige)/$fepos_sr1/g; 

	    if(/enable/){ print OUT_CONF $dir_sr1; }
	    elsif(/largeCap/){ print OUT_CONF $dir_sr1; }
	    elsif(/smallCap/){ print OUT_CONF $dir_sr1; }
	    elsif(/hitbus/){ print OUT_CONF $dir_sr1; }
	    elsif(/tdac/){ print OUT_CONF $dir_sr1; }
	    elsif(/fdac/){ print OUT_CONF $dir_sr1; }
	    else{ print OUT_CONF $_; }
	}
	close IN_CONF;
	close OUT_CONF;


	for(my $j=1; $j<@config_list_unige; $j++){
	    my $comd = "cp ".$config_list_unige[$j]." ".$config_list_sr1[$j];
	    system($comd);
	}

    }
}
close(IN_INFO);

# Make top config
my $topcfg_unige = "";
my $topcfg_sr1 = "";
if($keyid eq ""){  
    $topcfg_unige = $UNIGE_STAVE_CFG_BASE_DIR."/top/ac-side.cfg";
    $topcfg_sr1 = $SR1_STAVE_CFG_BASE_DIR."/".$stave_id."/moduleconfigs/".$stave_id."/top/top.cfg";
}else{
    $topcfg_unige = $UNIGE_STAVE_CFG_BASE_DIR."/top/ac-side__".$keyid.".cfg";
    $topcfg_sr1 = $SR1_STAVE_CFG_BASE_DIR."/".$stave_id."_".$keyid."/moduleconfigs/".$stave_id."/top/top.cfg";
}
my $num = 0;
open(TOPCFG_IN, $topcfg_unige) or die "$!";
open(TOPCFG_OUT, ">$topcfg_sr1") or die "$!";
while(<TOPCFG_IN>){
    if(/cfg/){
	print TOPCFG_OUT $UNIGE_STAVE_INFOFILE_DIR."/".$config_list_for_top_sr1[$num]."\n";
	$num++;
    }else{
	print TOPCFG_OUT $_;
    }
}
close(TOPCFG_IN);
close(TOPCFG_OUT); 


sub file_list_unige{
    my $module_dir_id = $_[0]; 
    my $module_id = $_[1];
    my $fepos = $_[2];

    my @file_list = ("configs", "fdacs", "tdacs", "masks_enable", "masks_hitbus", "masks_smallCap", "masks_largeCap");
    if($keyid eq ""){
	$file_list[0] = $UNIGE_STAVE_CFG_BASE_DIR."/".$module_dir_id."/configs/".$module_id."_fe".$fepos.".cfg";
	$file_list[1] = $UNIGE_STAVE_CFG_BASE_DIR."/".$module_dir_id."/fdacs/fdac_".$module_id."_fe".$fepos.".dat";
	$file_list[2] = $UNIGE_STAVE_CFG_BASE_DIR."/".$module_dir_id."/tdacs/tdac_".$module_id."_fe".$fepos.".dat";
	$file_list[3] = $UNIGE_STAVE_CFG_BASE_DIR."/".$module_dir_id."/masks/enable_".$module_id."_fe".$fepos.".dat";
	$file_list[4] = $UNIGE_STAVE_CFG_BASE_DIR."/".$module_dir_id."/masks/hitbus_".$module_id."_fe".$fepos.".dat";
	$file_list[5] = $UNIGE_STAVE_CFG_BASE_DIR."/".$module_dir_id."/masks/smallCap_".$module_id."_fe".$fepos.".dat";
	$file_list[6] = $UNIGE_STAVE_CFG_BASE_DIR."/".$module_dir_id."/masks/largeCap_".$module_id."_fe".$fepos.".dat";
    }else{
	$file_list[0] = $UNIGE_STAVE_CFG_BASE_DIR."/".$module_dir_id."/configs/".$module_id."_fe".$fepos."__".$keyid.".cfg";
	$file_list[1] = $UNIGE_STAVE_CFG_BASE_DIR."/".$module_dir_id."/fdacs/fdac_".$module_id."_fe".$fepos."__".$keyid.".dat";
	$file_list[2] = $UNIGE_STAVE_CFG_BASE_DIR."/".$module_dir_id."/tdacs/tdac_".$module_id."_fe".$fepos."__".$keyid.".dat";
	$file_list[3] = $UNIGE_STAVE_CFG_BASE_DIR."/".$module_dir_id."/masks/enable_".$module_id."_fe".$fepos."__".$keyid.".dat";
	$file_list[4] = $UNIGE_STAVE_CFG_BASE_DIR."/".$module_dir_id."/masks/hitbus_".$module_id."_fe".$fepos."__".$keyid.".dat";
	$file_list[5] = $UNIGE_STAVE_CFG_BASE_DIR."/".$module_dir_id."/masks/smallCap_".$module_id."_fe".$fepos."__".$keyid.".dat";
	$file_list[6] = $UNIGE_STAVE_CFG_BASE_DIR."/".$module_dir_id."/masks/largeCap_".$module_id."_fe".$fepos."__".$keyid.".dat";
    }
    return @file_list;
}

sub file_list_sr1{
    my $dir_sr1 = $_[0]; 
    my $module_id = $_[1];
    my $chipsn_6bit = $_[2];

    my @file_list = ("configs", "fdacs", "tdacs", "masks_enable", "masks_hitbus", "masks_smallCap", "masks_largeCap");
    if($keyid eq ""){
	$file_list[0] = $dir_sr1."/configs/".$module_id."_".$chipsn_6bit.".cfg";
	$file_list[1] = $dir_sr1."/fdacs/fdac_".$module_id."_".$chipsn_6bit.".dat";
	$file_list[2] = $dir_sr1."/tdacs/tdac_".$module_id."_".$chipsn_6bit.".dat";
	$file_list[3] = $dir_sr1."/masks/enable_".$module_id."_".$chipsn_6bit.".dat";
	$file_list[4] = $dir_sr1."/masks/hitbus_".$module_id."_".$chipsn_6bit.".dat";
	$file_list[5] = $dir_sr1."/masks/smallCap_".$module_id."_".$chipsn_6bit.".dat";
	$file_list[6] = $dir_sr1."/masks/largeCap_".$module_id."_".$chipsn_6bit.".dat";
    }else{
	$file_list[0] = $dir_sr1."/configs/".$module_id."_".$chipsn_6bit."__".$keyid.".cfg";
	$file_list[1] = $dir_sr1."/fdacs/fdac_".$module_id."_".$chipsn_6bit."__".$keyid.".dat";
	$file_list[2] = $dir_sr1."/tdacs/tdac_".$module_id."_".$chipsn_6bit."__".$keyid.".dat";
	$file_list[3] = $dir_sr1."/masks/enable_".$module_id."_".$chipsn_6bit."__".$keyid.".dat";
	$file_list[4] = $dir_sr1."/masks/hitbus_".$module_id."_".$chipsn_6bit."__".$keyid.".dat";
	$file_list[5] = $dir_sr1."/masks/smallCap_".$module_id."_".$chipsn_6bit."__".$keyid.".dat";
	$file_list[6] = $dir_sr1."/masks/largeCap_".$module_id."_".$chipsn_6bit."__".$keyid.".dat";
    }
    return @file_list;
}


sub mkdir_sr1{
    my $side = substr($_[0], 0, 1)."-side";
    my $mod_posid = substr($_[0], 0, 2);
    my $fe_posid = $_[0];
    my $module_id = $_[1];

    my @dir_list = ("configs", "fdacs", "tdacs", "masks");

    my $dir_sr1 = "";
    my $dir_sr1_top = "";
    if($keyid eq ""){
	$dir_sr1 = $SR1_STAVE_CFG_BASE_DIR."/".$stave_id."/moduleconfigs/".$stave_id."/".$side."/".
	    $mod_posid."/".$fe_posid."/".$module_id;
	$dir_sr1_top = $SR1_STAVE_CFG_BASE_DIR."/".$stave_id."/moduleconfigs/".$stave_id."/top";
    }else{
	$dir_sr1 = $SR1_STAVE_CFG_BASE_DIR."/".$stave_id."_".$keyid."/moduleconfigs/".$stave_id."/".$side."/".
	    $mod_posid."/".$fe_posid."/".$module_id;
	$dir_sr1_top = $SR1_STAVE_CFG_BASE_DIR."/".$stave_id."_".$keyid."/moduleconfigs/".$stave_id."/top";
    }

    while(my $tmp = shift(@dir_list)){
	my $dir = $dir_sr1."/".$tmp;
	my $comd = "mkdir -p ".$dir;
	system($comd);
    }    

    my $comd2 = "mkdir -p ".$dir_sr1_top;
    system($comd2);

    return $dir_sr1;
}
