#ifndef _InterconnectH_
#define _InterconnectH_
#include "jtag.h"
#include "clock_generation.h"
#include "ttc_fpga.h"
#include "bpi_fpga.h"
class CB_Front_IC : public TBundle {
public:
port TTC0P;
port TTC0N;
port TTC1P;
port TTC1N;
virtual void Register() {
reg( TTC0P );
reg( TTC0N );
reg( TTC1P );
reg( TTC1N );
}
};
class CB_Half_IC : public TBundle {
public:
port IC_BUS;
port IC_DPU[ DPU_HalfCount ];
virtual void Register() {
regb( IC_BUS, 5, 0 );
regab( IC_DPU, DPU_HalfCount, 24, 0 );
}
};
class CB_Back_IC : public TBundle {
public:
port TG;
port TMP_N;
port BG_A[ 6 ];
port BG_B[ 6 ];
virtual void Register() {
regb( TG, 15, 0 );
reg( TMP_N );
regab( BG_A, 6, 15, 0 );
regab( BG_B, 6, 15, 0 );
}
};
class CB_Host_IC : public TBundle {
public:
port HG;
port D;
port A;
port BPI_STB_N;
port TTC_STB_N;
port WR_N;
virtual void Register() {
regb( HG, 7, 0 );
regb( D, 15, 0 );
regb( A, 3, 0 );
regb( BPI_STB_N, 5, 0 );
reg( TTC_STB_N );
reg( WR_N );
}
};
class CM_Interconnect : public TModule {
public:
CB_Back_IC BK;
CB_IC_CG CG;
CB_Front_IC FP;
CB_Half_IC A;
CB_Half_IC B;
CB_Host_IC HO;
CB_IC_JT JT;
port MB_VCC;
port MB_VB;
port GND;
CM_BPI_FPGA BPI_FPGA[ 6 ];
CM_TTC_FPGA TTC_FPGA;
CP_SN65LVDS9637B Rcv_FP_TTC;
CP_R30 STerm_FP_TTC0;
CP_R30 STerm_FP_TTC1;
CP_R4_7K PullupTMP_N;
CP_CDC_POS Rcv_FP_VC_CDC;
virtual void Register() {
reg( BK );
reg( CG );
reg( FP );
reg( A );
reg( B );
reg( HO );
reg( JT );
reg( MB_VCC );
reg( MB_VB );
reg( GND );
rega( BPI_FPGA, 6 );
reg( TTC_FPGA );
reg( Rcv_FP_TTC );
reg( STerm_FP_TTC0 );
reg( STerm_FP_TTC1 );
reg( PullupTMP_N );
reg( Rcv_FP_VC_CDC );
}
virtual void Connect() {
wireall( MB_VCC, "VCC" );
wireall( MB_VB, "VB" );
wireall( GND );
MB_VCC << Rcv_FP_VC_CDC.POS;
wire( JT.TTC_FPGA, TTC_FPGA.JTAG_CONF );
for ( int i = 0; i < 6; ++ i ) {
wire( JT.BPI_FPGA[ i ], BPI_FPGA[ i ].JTAG_CONF );
}
for ( int i = 0; i < 6; i += 2 ) {
CG.RCLK( i >> 1 ) << BPI_FPGA[ i ].RCLK
<< BPI_FPGA[ i + 1 ].RCLK;
CG.SCLK( i >> 1 ) << BPI_FPGA[ i ].SCLK
<< BPI_FPGA[ i + 1 ].SCLK;
CG.TCLK( i >> 1 ) << BPI_FPGA[ i ].TCLK
<< BPI_FPGA[ i + 1 ].TCLK;
}
TTC_FPGA.RCLK << CG.RCLK( 3 );
TTC_FPGA.SCLK << CG.SCLK( 3 );
TTC_FPGA.TCLK << CG.TCLK( 3 );
Rcv_FP_TTC.IN_P1 << FP.TTC0P;
Rcv_FP_TTC.IN_N1 << FP.TTC0N;
Rcv_FP_TTC.IN_P2 << FP.TTC1P;
Rcv_FP_TTC.IN_N2 << FP.TTC1N;
Rcv_FP_TTC.OUT1 << "LOC_TTC0" ^ STerm_FP_TTC0 ^ "TTC0" << TTC_FPGA.FP_TTC( 0 );
Rcv_FP_TTC.OUT2 << "LOC_TTC1" ^ STerm_FP_TTC1 ^ "TTC1" << TTC_FPGA.FP_TTC( 1 );
TTC_FPGA.HG << HO.HG;
TTC_FPGA.D << HO.D;
TTC_FPGA.A << HO.A;
TTC_FPGA.WR_N << HO.WR_N;
TTC_FPGA.STB_N << HO.TTC_STB_N;
for ( int i = 0; i < 6; ++ i ) {
BPI_FPGA[ i ].D << HO.D( 3, 0 );
BPI_FPGA[ i ].A << HO.A;
BPI_FPGA[ i ].WR_N << HO.WR_N;
BPI_FPGA[ i ].STB_N << HO.BPI_STB_N( i );
}
conn( "TTC_TO_BPI", TTC_FPGA.BPI, 6 );
for ( int i = 0; i < 6; ++ i ) {
TTC_FPGA.BPI[ i ] << BPI_FPGA[ i ].AUX( 7, 0 );
}
conn( "TTC_TO_CEN", TTC_FPGA.CEN, 2 );
TTC_FPGA.CEN[ 0 ] << BPI_FPGA[ 1 ].AUX( 11, 8 );
TTC_FPGA.CEN[ 1 ] << BPI_FPGA[ 4 ].AUX( 11, 8 );
for ( int i = 0; i < 6; ++ i ) {
A.IC_DPU[ i ] << BPI_FPGA[ i ].DPU_A( 24, 0 );
B.IC_DPU[ i ] << BPI_FPGA[ i ].DPU_B( 24, 0 );
}
A.IC_BUS << TTC_FPGA.BUS_A;
B.IC_BUS << TTC_FPGA.BUS_B;
TTC_FPGA.TMP_N << BK.TMP_N ^ PullupTMP_N ^ MB_VCC;
TTC_FPGA.TG << BK.TG;
for ( int i = 0; i < 6; ++ i ) {
BPI_FPGA[ i ].BG_A << BK.BG_A[ i ];
BPI_FPGA[ i ].BG_B << BK.BG_B[ i ];
}
BPI_FPGA[ 1 ].BG_A << BPI_FPGA[ 0 ].AUX( 23, 8 );
BPI_FPGA[ 1 ].BG_B << BPI_FPGA[ 2 ].AUX( 23, 8 );
BPI_FPGA[ 4 ].BG_A << BPI_FPGA[ 3 ].AUX( 23, 8 );
BPI_FPGA[ 4 ].BG_B << BPI_FPGA[ 5 ].AUX( 23, 8 );
"CROSS_1_3_" << BPI_FPGA[ 3 ].CROSS << BPI_FPGA[ 1 ].AUX( 17, 12 );
"CROSS_1_5_" << BPI_FPGA[ 5 ].CROSS << BPI_FPGA[ 1 ].AUX( 23, 18 );
"CROSS_4_0_" << BPI_FPGA[ 0 ].CROSS << BPI_FPGA[ 4 ].AUX( 17, 12 );
"CROSS_4_2_" << BPI_FPGA[ 2 ].CROSS << BPI_FPGA[ 4 ].AUX( 23, 18 );
"CROSS_1_4_" << BPI_FPGA[ 1 ].CROSS << BPI_FPGA[ 4 ].CROSS;
}
};
#endif