void genDumpMod_call(int data, int reason) { handle child_handle, module_handle; char *pargs, *ptr, *mod_name; int pargs_found, level; char buf[128]; pargs = mc_scan_plusargs ("gen_dump_module="); pargs_found = 0; if (pargs != (char *)0) { strcpy(buf, pargs); mod_name = strtok (buf, ":"); ptr = strtok (NULL, " \n"); level = atoi (ptr); if (level > 0 ) {pargs_found = 1;} } if (pargs_found == 0) return; io_printf ("%s %d\n", mod_name, level); if ((fp = fopen("dump.mod", "w")) == 0) tf_error ("can't open dump.mod file\n"); acc_initialize(); module_handle = acc_handle_object (mod_name); child_handle = null; next_level (module_handle, level); acc_close(); fclose (fp); tf_dofinish(); }
/************************************************* lxt2_recordsetup - specify options ************************************************/ int lxt2_recordsetup( int data, int reason ) { int i; acc_initialize(); switch( reason ) { case reason_checktf: if( tf_nump() == 0 ) { tf_error( "not enough arguments to recordsetup" ); tf_dofinish(); } goto DONE; case reason_calltf: if( lxt.inited ) { tf_error( "recording has already started" ); tf_dofinish(); } break; default: goto DONE; } for( i = 1; i <= tf_nump(); ++i ) { lxt2_option( acc_fetch_tfarg_str(i) ); } DONE: acc_close(); return 0; }
/************************************************* lxt2_recordclose - close lxt file and stop recording ************************************************/ int lxt2_recordclose( int data, int reason ) { acc_initialize(); switch( reason ) { case reason_checktf: if( tf_nump() != 0 ) { tf_error( "too many arguments to recordclose" ); tf_dofinish(); } goto DONE; case reason_calltf: if( !lxt.inited ) { tf_error( "recording has not started" ); tf_dofinish(); goto DONE; } break; default: goto DONE; } lxt2_close(); DONE: acc_close(); return 0; }
int to_float32() { union { float f; unsigned int u; } _uf; // initialize tasks acc_initialize(); static s_setval_delay delay_s = {accRealTime, accNoDelay}; static s_setval_value value_s = {accIntVal}; delay_s.time.real = 0; handle reg = acc_handle_tfarg(1); // get register handle float val = acc_fetch_tfarg(2); // get floating number // set floating-point binary value _uf.f = val; value_s.value.integer = _uf.u; acc_set_value(reg,&value_s,&delay_s); }
int util_get_plus_args_str() { /* Example use: invocation script (bosox is passed in as first argument) ----------------- set basename = $1 verilog mymodule.v +tst_file_name${basename}.tst +log_file_name${basename}.log +err_file_name${basename}.err +result_file_name${basename}.result mymodule.v ---------- reg [32*8:1] tst_file_name; // plus argument string value reg [32*8:1] err_file_name; // plus argument string value reg [32*8:1] log_file_name; // plus argument string value reg [32*8:1] result_file_name; // plus argument string value integer plus_arg_ok; // 0 if ok, 1 if no plus argument value initial begin // get strings from plus argument values plus_arg_ok = $util_get_plus_args_str("tst_file_name", tst_file_name); plus_arg_ok = $util_get_plus_args_str("err_file_name", err_file_name); plus_arg_ok = $util_get_plus_args_str("log_file_name", log_file_name); plus_arg_ok = $util_get_plus_args_str("result_file_name",result_file_name); $display("tst_file_name is %s", tst_file_name); $display("err_file_name is %s", err_file_name); $display("log_file_name is %s", log_file_name); $display("result_file_name is %s", result_file_name); end */ /* Input is string Returning value is string. */ handle wrk_out; char *strArgIn; int sizeOut,sizeS_in; int numArgs; int cnt,size; char *buffer, *bufferout; s_setval_value value_out; s_setval_delay delay_out; delay_out.model = accNoDelay; delay_out.time.type = accRealTime; delay_out.time.real = 0.0; value_out.format = accHexStrVal; acc_initialize(); numArgs = tf_nump(); if(numArgs !=2) { tf_error("$get_plus_arg_string must have two arguments"); tf_putp(0,VERILOG_ERROR); return(VERILOG_ERROR); } /* Fetch the input register and size */ wrk_out = acc_handle_tfarg(2); sizeOut = (acc_fetch_size(wrk_out)/8); /* Get the string value */ strArgIn = mc_scan_plusargs(tf_getcstringp(1)); if (strArgIn == NULL) { if (DEBUG_PLUS_ARGS) io_printf("get_plus_args_str(): Matching string is not found: %s.\n", tf_getcstringp(1)); tf_putp(0,VERILOG_ERROR); return(VERILOG_ERROR); } if (strArgIn) { if (DEBUG_PLUS_ARGS) io_printf("get_plus_args_str(): Got string value: %s\n",strArgIn); } else { io_printf("get_plus_args_str(): Bad input string value.\n"); tf_putp(0,VERILOG_ERROR); return(VERILOG_ERROR); } /* Build new string */ sizeS_in = strlen(strArgIn); bufferout = (char *) malloc(sizeS_in + 1); sprintf(bufferout, "%s",strArgIn); if (sizeOut < sizeS_in) { tf_error("get_plus_args_str(): Register %s is not large enough.\n", acc_fetch_fullname(wrk_out)); tf_putp(0,VERILOG_ERROR); return(VERILOG_ERROR); } size = sizeS_in*2; buffer = (char *) malloc(size + 1); for (cnt =0; cnt < size; cnt +=2){ if (cnt < size){ /* Convert string into HEX code */ sprintf(&buffer[cnt],"%x",bufferout[cnt/2]); } } /* Null out the rest of the register else { buffer[cnt] = '\0'; buffer[cnt +1] = '\0'; } */ /* assign buffer to the verilog register */ value_out.value.str = buffer; acc_set_value(wrk_out, &value_out, &delay_out); tf_putp(0,VERILOG_OK); acc_close(); free(buffer); free(bufferout); return(VERILOG_OK); }
/************************************************* lxt2_recordvars - add objects to be recorded ************************************************/ int lxt2_recordvars( int data, int reason ) { int update = 0; int objects = 0; int i; acc_initialize(); switch( reason ) { case reason_calltf: break; case reason_checktf: goto DONE; case reason_finish: if( lxt.inited ) { lxt2_close(); } goto DONE; case reason_rosynch: update = (lxt.updateList != NULL); while( lxt.updateList ) { info_p info; info = lxt.updateList; lxt2_dump( info, 0 ); lxt.updateList = info->updateNext; info->updateNext = 0; } if( update ) { lxt2_timemarkerp1(); } while( lxt.eventList ) { info_p info; info = lxt.eventList; lxt2_dump( info, 1 ); lxt.eventList = info->updateNext; info->updateNext = 0; } lxt2_nexttimemarker(); goto DONE; default: goto DONE; } ginstance = tf_getinstance(); /* * parse options first */ for( i = 1; i <= tf_nump(); ++i ) { handle object; if( tf_typep(i) == tf_nullparam ) { continue; } if( tf_typep(i) == tf_string ) { char* str = acc_fetch_tfarg_str(i); lxt2_option( str ); continue; } } /* * on first call, initialize structure */ if( !lxt.inited ) { lxt2_init(); } for( i = 1; i <= tf_nump(); ++i ) { handle object; if( tf_typep(i) == tf_nullparam ) { continue; } if( tf_typep(i) == tf_string ) { continue; } object = acc_handle_tfarg(i); if( !object ) { tf_error( "cannot find object" ); tf_dofinish(); goto DONE; } lxt2_add( object, lxt.depth ); objects++; } if( objects == 0 ) { #if DEBUG io_printf( "lxt2_recordvars: defaultpath=%s\n", acc_fetch_fullname(acc_handle_parent(acc_handle_tfinst())), lxt.depth ); #endif lxt2_add( acc_handle_parent(acc_handle_tfinst()), lxt.depth ); } lxt2_dump( lxt.objectList, 1 ); DONE: acc_close(); return 0; }