// State: (PC0:int, PC1:int, turn:int, flags:array) // flag[0] = true; int pg_transition_p0_0(model_t model, int*src,TransitionCB callback,void*user_context) { int dst[state_length()]; // the next state values // not all variables are modified so copy the source state memcpy(dst, src, sizeof(int) * state_length()); dst[0] = 1; // PC0 = 1 // set the chunk int index = src[3]; chunk res=GBchunkGet(model, char_array_type, index); char *flags_old = res.data; char flags[2] = {}; flags[0] = 1; flags[1] = flags_old[1]; index = GBchunkPut(model, char_array_type, chunk_ld(2, flags)); dst[3] = index; int action[1]; action[0] = action0_index; transition_info_t transition_info = { action, 0 }; int cpy[4] = {1,0,0,1}; // provide modified variables callback(user_context, &transition_info, dst, cpy); return 1; // return number of successors }
int* initial_state(model_t model) { initial[0] = 0; // PC0 initial[1] = 0; // PC1 initial[2] = 0; // turn = 0 char flags[2] = {}; flags[0] = 0; flags[1] = 0; int index = GBchunkPut(model, char_array_type, chunk_ld(2, flags)); initial[3] = index; return initial; }
static chunk get_chunk(value_table_t vt,value_index_t idx){ int len; char* data=SIgetC(vt->index,idx,&len); if (data==NULL) { if (HREme(vt->ctx)==0) Abort("chunk %d does not exist",idx); Debug("looking up index %d",idx); if (vt->msg_pending) HREyieldWhile(vt->ctx,&vt->msg_pending); vt->task=idx; memcpy(vt->msg->buffer,&idx,4); vt->msg->tail=4; vt->task_pending=1; vt->msg_pending=1; HREpostSend(vt->msg); HREyieldWhile(vt->ctx,&vt->task_pending); data=SIgetC(vt->index,idx,&len); data[len]=0; Debug("got %s (%d)",data,vt->msg_pending); } return chunk_ld(len,data); }
static int aut_read_edge(lts_file_t file,int *src_seg,void* src_state, int *dst_seg,void*dst_state,void* labels){ *src_seg=0; *dst_seg=0; char buffer[BUFFER_SIZE]; errno=0; if (fgets(buffer,BUFFER_SIZE,file->f)==NULL){ if (errno) AbortCall("while reading %s",lts_file_get_name(file)); return 0; } int from_idx,from_end,label_idx,to_idx,i; // find destination state and end of label for(i=strlen(buffer);!isdigit((unsigned char)buffer[i]);i--); buffer[i+1]=0; for(;isdigit((unsigned char)buffer[i]);i--); to_idx=i+1; for(;buffer[i]!=',';i--); for(i--;isblank((unsigned char)buffer[i]);i--); buffer[i+1]=0; // find source state and begin of label for(i=0;!isdigit((unsigned char)buffer[i]);i++); from_idx=i; for(;isdigit((unsigned char)buffer[i]);i++); from_end=i; for(;buffer[i]!=',';i++); for(i++;isblank((unsigned char)buffer[i]);i++); buffer[from_end]='\00'; label_idx=i; int lbl_len=strlen(buffer+label_idx); char tmp_data[lbl_len]; chunk tmp_chunk=chunk_ld(lbl_len,tmp_data); string2chunk(buffer+label_idx,&tmp_chunk); // write the results *((uint32_t*)src_state)=(uint32_t)atoll(buffer+from_idx); *((uint32_t*)labels)=VTputChunk(lts_file_get_table(file,file->type_no),tmp_chunk); *((uint32_t*)dst_state)=(uint32_t)atoll(buffer+to_idx); return 1; }
static void lts_read_dir(archive_t archive,lts_t lts){ Print(infoShort,"opening info"); stream_t input=arch_read(archive,"info"); dir_info_t info=DIRinfoRead(input,1); DSclose(&input); int segments=info->segment_count; Print(infoShort,"got info for %d segments",segments); int offset[segments]; offset[0]=0; for(int i=1;i<segments;i++){ offset[i]=info->state_count[i-1]+offset[i-1]; } int s_count=0; int t_count=0; for(int i=0;i<segments;i++){ s_count+=info->state_count[i]; for(int j=0;j<segments;j++){ t_count+=info->transition_count[i][j]; } } Print(infoShort,"counted %u states and %u transitions",s_count,t_count); lts_set_sig(lts,single_action_type()); lts_set_type(lts,LTS_LIST); lts_set_size(lts,1,s_count,t_count); lts->root_list[0]=offset[info->initial_seg]+info->initial_ofs; lts->tau=info->label_tau; Print(infoShort,"getting %d labels from TermDB",info->label_count); input=arch_read(archive,"TermDB"); int type_no=lts_type_get_edge_label_typeno(lts->ltstype,0); for(int i=0;i<info->label_count;i++){ char *line=DSreadLN(input); int len=strlen(line); char data[len]; chunk tmp_chunk=chunk_ld(len,data); string2chunk(line,&tmp_chunk); VTputAtChunk(lts->values[type_no], tmp_chunk, i); } DSclose(&input); Print(infoShort,"got labels"); int t_offset=0; char filename[1024]; for(int i=0;i<segments;i++){ for(int j=0;j<segments;j++){ sprintf(filename,"src-%d-%d",i,j); stream_t src=arch_read(archive,filename); sprintf(filename,"label-%d-%d",i,j); stream_t lbl=arch_read(archive,filename); sprintf(filename,"dest-%d-%d",i,j); stream_t dst=arch_read(archive,filename); for(int k=0;k<info->transition_count[i][j];k++){ lts->src[t_offset]=offset[i]+DSreadU32(src); lts->label[t_offset]=DSreadU32(lbl); lts->dest[t_offset]=offset[j]+DSreadU32(dst); t_offset++; } DSclose(&src); DSclose(&lbl); DSclose(&dst); } } DIRinfoDestroy(info); }
void HREgreyboxCAtI(void*map,void*data,int len,int pos){ return VTputAtChunk((value_table_t)map,chunk_ld(len,data),pos); }
int HREgreyboxC2I(void*map,void*data,int len){ return VTputChunk((value_table_t)map,chunk_ld(len,data)); }