00001 #include <stdlib.h>
00002 #include "sadie.h"
00003 #include "chain.h"
00004
00005
00006 void SYNTHESIZE_INSERT_RING (
00007 CHAIN *chainmap,
00008 int ring,
00009 int fracWidth,
00010 int ringnum
00011 ) {
00012 int left_x, left_y, right_x, right_y;
00013 int prevx, prevy, currx, curry;
00014 int AddAfterLast = 0;
00015 unsigned char code;
00016 LIST_NODE *leftLnode;
00017 LIST_NODE *rightLnode;
00018 LIST_NODE *tempLnode;
00019 CHAIN_NODE *leftCnode;
00020 CHAIN_NODE *rightCnode;
00021 CHAIN_NODE *tempCnode;
00022 CHAIN_NODE ** prevCnode;
00023 char msg[SLEN];
00024
00025 leftLnode = chainmap->list;
00026 while(leftLnode != NULL && leftLnode->ring_id != ring)
00027 leftLnode = leftLnode->next;
00028
00029 if( leftLnode == NULL ) {
00030 sprintf(msg, "SynthesizeInsertRing >> Ring %d not found", ring);
00031 MESSAGE('E', msg);
00032 goto the_end;
00033 }
00034
00035 if( leftLnode->next == NULL ) {
00036 AddAfterLast = 1;
00037 } else if( fracWidth <= 0 || fracWidth >= 100 ) {
00038 sprintf(msg, "Sadie_TREES_SynthesizeDisplayRing >> Percentage of width should be between 1 and 99");
00039 MESSAGE('E', msg);
00040 goto the_end;
00041 }
00042
00043
00044 if ((tempLnode = (LIST_NODE *)malloc(sizeof(LIST_NODE))) == NULL) {
00045 MESSAGE('E', " Memory request failed.");
00046 goto the_end;
00047 }
00048
00049 tempLnode->ring_id = ringnum;
00050 tempLnode->ring_type = ADDED;
00051 tempLnode->next = NULL;
00052
00053 if (AddAfterLast)
00054 rightLnode = leftLnode;
00055 else
00056 rightLnode = leftLnode->next;
00057
00058 left_x = leftLnode->startk;
00059 left_y = leftLnode->startj;
00060 right_x = rightLnode->startk;
00061 right_y = rightLnode->startj;
00062
00063 leftCnode = leftLnode->chain;
00064 rightCnode = rightLnode->chain;
00065
00066 if (left_y < right_y)
00067 while(leftCnode != NULL && left_y != right_y) {
00068 CHAIN_COMPUTE_COORDINATES(left_x, left_y, leftCnode->code, &left_x, &left_y);
00069 leftCnode = (CHAIN_NODE *)leftCnode->next;
00070 }
00071 else if (right_y < left_y)
00072 while(rightCnode != NULL && right_y != left_y) {
00073 CHAIN_COMPUTE_COORDINATES(right_x, right_y, rightCnode->code, &right_x, &right_y);
00074 rightCnode = (CHAIN_NODE *)rightCnode->next;
00075 }
00076
00077 prevx = (int)(left_x + (right_x - left_x) * (float)fracWidth/100.0 + (float)(AddAfterLast*fracWidth));
00078 prevy = left_y;
00079 tempLnode->startk = prevx;
00080 tempLnode->startj = prevy;
00081
00082 prevCnode = (CHAIN_NODE **)&(tempLnode->chain);
00083 while(leftCnode != NULL && rightCnode != NULL) {
00084
00085 CHAIN_COMPUTE_COORDINATES(left_x, left_y, leftCnode->code, &left_x, &left_y);
00086 CHAIN_COMPUTE_COORDINATES(right_x, right_y, rightCnode->code, &right_x, &right_y);
00087 currx = (int)(left_x + (right_x - left_x) * (float)fracWidth/100.0 + (float)(AddAfterLast*fracWidth));
00088 curry = left_y;
00089
00090 CHAIN_COMPUTE_CODE(prevy, prevx, curry, currx, &code);
00091
00092
00093 if ((tempCnode = (CHAIN_NODE *)malloc(sizeof(CHAIN_NODE))) == NULL) {
00094 MESSAGE('E', " Memory request failed.");
00095 goto the_end;
00096 }
00097
00098 tempCnode->code = code;
00099 tempCnode->valid = 0;
00100 tempCnode->next = NULL;
00101 (*prevCnode) = tempCnode;
00102 prevCnode = (CHAIN_NODE **)&(tempCnode->next);
00103
00104 prevx = currx;
00105 prevy = curry;
00106 leftCnode = (CHAIN_NODE *)leftCnode->next;
00107 rightCnode = (CHAIN_NODE *)rightCnode->next;
00108
00109 }
00110
00111 tempLnode->next = leftLnode->next;
00112 leftLnode->next = tempLnode;
00113
00114 the_end:
00115 }