#include #include #include #include #define FALSE 0 #define TRUE 1 extern PROGRAM *prd; /***********************************************************************/ /* */ /* search for mpclk rise delay from d1 le, mpclk fall delay from d3 le */ /* */ /***********************************************************************/ function mpclk_search (shl_test_cond) = User_data_block *shl_test_cond; { /* int psearch(tpass,tfail,tres,parameter_name,timing_block_name,result) */ extern int psearch(); /* int modify_param(timing_block_name, parameter_name, param_value) */ extern int modify_param(); extern Levels_block shl_hv_ac, shl_lv_ac; extern Timing_block mh1_spec; extern Pindef_block cmos_out_mpclk; extern Pindef_block mpclk; int srch_retn, status; int ac_flag; /* typedef enum Boolean { FALSE, TRUE } boolean; */ /* boolean ac_flag; */ float mpclkrd, upclkrd, rdtemp, mpclkfd, upclkfd, fdtemp, mpc_hw, mpc_lw; float vohm, volm, vtemp; Levels_block *ac_cond; if (shl_test_cond->data) { if (strcmp(shl_test_cond->data,"shl_hv_ac") == 0) { volm = 0.6; vohm = 3.9; vtemp = (5.25 - 0.2)/2 + 0.45; ac_cond = &shl_hv_ac; ac_flag = TRUE; } else if (strcmp(shl_test_cond->data,"shl_lv_ac") == 0) { volm = 0.6; vohm = 3.75; vtemp = (4.75 - 0.2)/2 + 0.20; ac_cond = &shl_lv_ac; ac_flag = TRUE; } else { ac_flag = FALSE; return(0); } } if (ac_flag == TRUE) { /* Measure mpclk rise delay */ status=change_level(prd,ac_cond,PINGROUP,&cmos_out_mpclk, VOL,volm,VOH,0.0,0,0); if (status != 0) { return(0); } status=setup_levels(prd,ac_cond); if (status != 0) { return(0); } status=change_timing_value(prd,&mh1_spec,PINDEF,&mpclk, EDGESET,1,1,5e-9,EDGESET,1,2,10e-9,0.0); if (status != 0) { return(0); } status=setup_timing(prd,&mh1_spec); if (status != 0) { return(0); } srch_retn = psearch(40e-9, 90e-9, 0.1e-9, "mpclk_ste1","mh1_spec", &mpclkrd); if (srch_retn == 0 ) { status=change_level(prd,ac_cond,PINGROUP,&cmos_out_mpclk, VOL,volm,VOH,vohm,0.0); if (status != 0) { return(0); } status=setup_levels(prd,ac_cond); if (status != 0) { return(0); } printf("return = %i\n",srch_retn); return(srch_retn); } printf("\nMPCLK Rise Delay from T0 = %5.2fnS\n",mpclkrd*1e9); /* if (mpclkrd < 42e-9 || mpclkrd > 89e-9) */ if (mpclkrd < 40e-9 || mpclkrd > 90e-9) { printf("\n*******************************************************\n"); printf("* MPCLKRD ERROR SEARCH DID NOT PASS CHECK TIMING *\n"); printf("* *\n"); printf("* LOW = 40NS HIGH = 90NS *\n"); printf("* RESULT = %6.2fnS *\n", mpclkrd*1e9); printf("*******************************************************\n\n"); } rdtemp=mpclkrd; status=change_level(prd,ac_cond,PINGROUP,&cmos_out_mpclk, VOL,vohm,VOH,0.0,0.0); if (status != 0) { return(0); } status=setup_levels(prd,ac_cond); if (status != 0) { return(0); } srch_retn = psearch(40e-9, 90e-9, 0.1e-9, "mpclk_ste1","mh1_spec", &mpclkrd); if (srch_retn == 0 ) { status=change_level(prd,ac_cond,PINGROUP,&cmos_out_mpclk, VOL,volm,VOH,vohm,0.0); if (status != 0) { return(0); } status=setup_levels(prd,ac_cond); if (status != 0) { return(0); } return(srch_retn); } printf("\nMPCLK Rise Delay from T0 = %5.2fnS\n",mpclkrd*1e9); /* if (mpclkrd < 42e-9 || mpclkrd > 89e-9) */ if (mpclkrd < 40e-9 || mpclkrd > 90e-9) { printf("\n*******************************************************\n"); printf("* MPCLKRD ERROR SEARCH DID NOT PASS CHECK TIMING *\n"); printf("* *\n"); printf("* LOW = 40NS HIGH = 90NS *\n"); printf("* RESULT = %6.2fnS *\n", mpclkrd*1e9); printf("*******************************************************\n\n"); } /* printf("\nrdtemp = %5.2fnS\n",rdtemp*1e9); printf("\nmpclkrd = %5.2fnS\n",mpclkrd*1e9); */ upclkrd=(rdtemp + mpclkrd)/2; /* printf("\nupclkrd = %5.2fnS\n",upclkrd*1e9); */ mpclkrd=upclkrd-12e-9; /* printf("\nmpclkrd = %5.2fnS\n",mpclkrd*1e9); */ /* Measure mpclk fall delay */ status=modify_param("mh1_spec","mpclkrd",mpclkrd); if (status == 0) { return(0); } status=change_level(prd,ac_cond,PINGROUP,&cmos_out_mpclk, VOL,volm,VOH,0.0,0.0); if (status != 0) { return(0); } status=setup_levels(prd,ac_cond); if (status != 0) { return(0); } status=change_timing_value(prd,&mh1_spec,PINDEF,&mpclk, EDGESET,1,1,140e-9,EDGESET,1,2,145e-9,0.0); if (status != 0) { return(0); } status=setup_timing(prd,&mh1_spec); if (status != 0) { return(0); } srch_retn = psearch(140e-9, 50e-9, 0.1e-9, "mpclk_sle1","mh1_spec", &mpclkfd); if (srch_retn == 0 ) { status=change_level(prd,ac_cond,PINGROUP,&cmos_out_mpclk, VOL,volm,VOH,vohm,0.0); if (status != 0) { return(0); } status=setup_levels(prd,ac_cond); if (status != 0) { return(0); } return(srch_retn); } printf("\nMPCLK Fall Delay from T0 = %5.2fnS\n",mpclkfd*1e9); /* if (mpclkfd < 52e-9 || mpclkfd > 138e-9) */ if (mpclkfd < 50e-9 || mpclkfd > 140-9) { printf("\n*******************************************************\n"); printf("* MPCLKFD ERROR SEARCH DID NOT PASS CHECK TIMING *\n"); printf("* *\n"); printf("* LOW = 50NS HIGH = 140NS *\n"); printf("* RESULT = %6.2fnS *\n", mpclkfd*1e9); printf("*******************************************************\n\n"); } fdtemp=mpclkfd; status=change_level(prd,ac_cond,PINGROUP,&cmos_out_mpclk, VOL,vohm,VOH,0.0,0.0); if (status != 0) { return(0); } status=setup_levels(prd,ac_cond); if (status != 0) { return(0); } srch_retn = psearch(140e-9, 50e-9, 0.1e-9, "mpclk_sle1","mh1_spec", &mpclkfd); if (srch_retn == 0 ) { status=change_level(prd,ac_cond,PINGROUP,&cmos_out_mpclk, VOL,volm,VOH,vohm,0.0); if (status != 0) { return(0); } status=setup_levels(prd,ac_cond); if (status != 0) { return(0); } return(srch_retn); } printf("\nMPCLK Fall Delay from T0 = %5.2fnS\n",mpclkfd*1e9); /* if (mpclkfd < 52e-9 || mpclkfd > 138e-9) */ if (mpclkfd < 50e-9 || mpclkfd > 140-9) { printf("\n*******************************************************\n"); printf("* MPCLKFD ERROR SEARCH DID NOT PASS CHECK TIMING *\n"); printf("* *\n"); printf("* LOW = 50NS HIGH = 140NS *\n"); printf("* RESULT = %6.2fnS *\n", mpclkfd*1e9); printf("*******************************************************\n\n"); } upclkfd=(fdtemp + mpclkfd)/2; mpclkfd=upclkfd-62e-9; status=modify_param("mh1_spec","mpclkfd",mpclkfd); if (status == 0) { return(0); } status=change_level(prd,ac_cond,PINGROUP,&cmos_out_mpclk, VOL,vtemp,VOH,0.0,0.0); if (status != 0) { return(0); } status=setup_levels(prd,ac_cond); if (status != 0) { return(0); } /* mpclk_rise */ srch_retn = psearch(40e-9, 90e-9, 0.1e-9, "mpclk_ste1","mh1_spec", &upclkrd); if (srch_retn == 0 ) { status=change_level(prd,ac_cond,PINGROUP,&cmos_out_mpclk, VOL,volm,VOH,vohm,0.0); if (status != 0) { return(0); } status=setup_levels(prd,ac_cond); if (status != 0) { return(0); } return(srch_retn); } /* mpclk_fall */ srch_retn = psearch(140e-9, 50e-9, 0.1e-9, "mpclk_sle1","mh1_spec", &upclkfd); if (srch_retn == 0 ) { status=change_level(prd,ac_cond,PINGROUP,&cmos_out_mpclk, VOL,volm,VOH,vohm,0.0); if (status != 0) { return(0); } status=setup_levels(prd,ac_cond); if (status != 0) { return(0); } return(srch_retn); } mpc_hw = (upclkfd - upclkrd); mpc_lw = (101.7e-9 - mpc_hw); printf("\nMPCLK High Time = %5.2fnS\n",mpc_hw*1e9); printf("\nMPCLK Low Time = %5.2fnS\n",mpc_lw*1e9); if (mpc_hw > 48.7e-9 || mpc_hw < 39e-9) { printf("\n*******************************************************\n"); printf("MPCLK High %5.2fnS FAILED 48.7-39ns range *\n", mpc_hw*1e9); printf("*******************************************************\n\n"); status=change_level(prd,ac_cond,PINGROUP,&cmos_out_mpclk, VOL,volm,VOH,vohm,0.0); if (status != 0) { return(0); } status=setup_levels(prd,ac_cond); if (status != 0) { return(0); } /* return(0); */ return(1); } status=change_level(prd,ac_cond,PINGROUP,&cmos_out_mpclk, VOL,volm,VOH,vohm,0.0); if (status != 0) { return(0); } status=setup_levels(prd,ac_cond); if (status != 0) { return(0); } status=modify_param("mh1_spec","mpclk_sle1",140e-9); if (status == 0) { return(0); } status=modify_param("mh1_spec","mpclk_ste1",145e-9); if (status == 0) { return(0); } return(1); } }