void flowrpo(Graph *g) { Flow *r1; int32 i, d, me, nr, *idom; Flow **rpo2r; free(g->rpo); g->rpo = calloc(g->num*sizeof g->rpo[0], 1); idom = calloc(g->num*sizeof idom[0], 1); if(g->rpo == nil || idom == nil) fatal("out of memory"); for(r1 = g->start; r1 != nil; r1 = r1->link) r1->active = 0; rpo2r = g->rpo; d = postorder(g->start, rpo2r, 0); nr = g->num; if(d > nr) fatal("too many reg nodes %d %d", d, nr); nr = d; for(i = 0; i < nr / 2; i++) { r1 = rpo2r[i]; rpo2r[i] = rpo2r[nr - 1 - i]; rpo2r[nr - 1 - i] = r1; } for(i = 0; i < nr; i++) rpo2r[i]->rpo = i; idom[0] = 0; for(i = 0; i < nr; i++) { r1 = rpo2r[i]; me = r1->rpo; d = -1; // rpo2r[r->rpo] == r protects against considering dead code, // which has r->rpo == 0. if(r1->p1 != nil && rpo2r[r1->p1->rpo] == r1->p1 && r1->p1->rpo < me) d = r1->p1->rpo; for(r1 = r1->p2; r1 != nil; r1 = r1->p2link) if(rpo2r[r1->rpo] == r1 && r1->rpo < me) d = rpolca(idom, d, r1->rpo); idom[i] = d; } for(i = 0; i < nr; i++) { r1 = rpo2r[i]; r1->loop++; if(r1->p2 != nil && loophead(idom, r1)) loopmark(rpo2r, i, r1); } free(idom); for(r1 = g->start; r1 != nil; r1 = r1->link) r1->active = 0; }
void main() { int c; c = 0; serDopen(19200); while (c != Esc) { loophead(); costate { wfd c = cof_serDgetc(); // yields until successfully getting a character wfd cof_serDputc(c); // then yields here until c successfully put } } serDclose(); // disables D serial port reading and writing }
void loopit(Reg *r, int32 nr) { Reg *r1; int32 i, d, me; if(nr > maxnr) { rpo2r = mal(nr * sizeof(Reg*)); idom = mal(nr * sizeof(int32)); maxnr = nr; } d = postorder(r, rpo2r, 0); if(d > nr) fatal("too many reg nodes %d %d", d, nr); nr = d; for(i = 0; i < nr / 2; i++) { r1 = rpo2r[i]; rpo2r[i] = rpo2r[nr - 1 - i]; rpo2r[nr - 1 - i] = r1; } for(i = 0; i < nr; i++) rpo2r[i]->rpo = i; idom[0] = 0; for(i = 0; i < nr; i++) { r1 = rpo2r[i]; me = r1->rpo; d = -1; // rpo2r[r->rpo] == r protects against considering dead code, // which has r->rpo == 0. if(r1->p1 != R && rpo2r[r1->p1->rpo] == r1->p1 && r1->p1->rpo < me) d = r1->p1->rpo; for(r1 = r1->p2; r1 != nil; r1 = r1->p2link) if(rpo2r[r1->rpo] == r1 && r1->rpo < me) d = rpolca(idom, d, r1->rpo); idom[i] = d; } for(i = 0; i < nr; i++) { r1 = rpo2r[i]; r1->loop++; if(r1->p2 != R && loophead(idom, r1)) loopmark(rpo2r, i, r1); } }
void loopit(Reg *r, int32_t nr) { Reg *r1; int32_t i, d, me; if(nr > maxnr) { rpo2r = alloc(nr * sizeof(Reg*)); idom = alloc(nr * sizeof(int32_t)); maxnr = nr; } d = postorder(r, rpo2r, 0); if(d > nr) fatal(Z, "too many reg nodes"); nr = d; for(i = 0; i < nr / 2; i++){ r1 = rpo2r[i]; rpo2r[i] = rpo2r[nr - 1 - i]; rpo2r[nr - 1 - i] = r1; } for(i = 0; i < nr; i++) rpo2r[i]->rpo = i; idom[0] = 0; for(i = 0; i < nr; i++){ r1 = rpo2r[i]; me = r1->rpo; d = -1; if(r1->p1 != R && r1->p1->rpo < me) d = r1->p1->rpo; for(r1 = r1->p2; r1 != nil; r1 = r1->p2link) if(r1->rpo < me) d = rpolca(idom, d, r1->rpo); idom[i] = d; } for(i = 0; i < nr; i++){ r1 = rpo2r[i]; r1->loop++; if(r1->p2 != R && loophead(idom, r1)) loopmark(rpo2r, i, r1); } }
void main() { int c; // This is necessary for initializing RS232 functionality of LP35XX boards. #if _BOARD_TYPE_ == 0x1200 || _BOARD_TYPE_ == 0x1201 brdInit(); #endif c = 0; serBopen(19200); while (c != Esc) { loophead(); costate { wfd c = cof_serBgetc(); // yields until successfully getting a character wfd cof_serBputc(c); // then yields here until c successfully put } } serBclose(); // disables B serial port reading and writing }
void main() { auto int c, num_bytes, done; auto char *ptr; auto int parallel_counter, loop_counter; auto char buffer[256]; auto char s[256]; brdInit(); //required for BL2100 series boards c = 0; //initialize variables parallel_counter = 0; loop_counter = 0; done = FALSE; sprintf(s, "Character counter = %d", 0); //initialize for proper STDIO effects DispStr(2, 2, s); // display exit message DispStr(2, 5, "Press the ESC key in Hyperterminal to exit the program"); serCopen(BAUD_RATE); //set baud rates for the serial ports to be used serBopen(BAUD_RATE); serCwrFlush(); //clear Rx and Tx data buffers serCrdFlush(); serBwrFlush(); serBrdFlush(); serMode(0); //required for BL2100 series bds...must be done after serXopen function(s) while (!done) { loophead(); //required for single-user cofunctions costate //single-user serial cofunctions { // Wait for char from hyperterminal wfd c = cof_serBgetc(); // yields until successfully getting a character //do clean exit from costatement if(c == ESC) { //flag used to exit out of this WHILE loop and other costatements done = TRUE; //abort this costatement abort; } // send character to serial port C wfd cof_serBputc(c); // yields until c successfully put // wait for char from serial port C wfd c = cof_serCgetc(); // yields until successfully getting a character //send character back to hyperterminal wfd cof_serCputc(c); // yields until c successfully put waitfor(serCwrUsed() == 0); //demonstrates that the above cofunctions only yields to other costates //and not to the code within the same costatement section. sprintf(s, "Character counter = %d", ++loop_counter); DispStr(2, 2, s); } costate { // Abort this costatement if the done flag has been set if(done) { abort; //do clean exit of costatement } //execute code while waiting for characters from hyperterminal sprintf(s, "Parallel code execution counter = %d\r", parallel_counter++); DispStr(2, 3, s); } } // send program exit message serBputs("\n\n\rProgram Done...exiting"); // wait for memory data buffer, serial holding register, and shift // register all to become empty while (serBwrFree() != BOUTBUFSIZE); while((RdPortI(SBSR)&0x08) || (RdPortI(SBSR)&0x04)); // read data and send to hyperterminal num_bytes = serCread(buffer, sizeof(buffer), 5); buffer[num_bytes] = '\0'; serCwrite(buffer, strlen(buffer)); // wait for memory data buffer, serial holding register, and shift // register all to become empty while (serCwrFree() != COUTBUFSIZE); while((RdPortI(SCSR)&0x08) || (RdPortI(SCSR)&0x04)); //close the serial ports serCclose(); serBclose(); }