/* decide_point returns the number of hops needed in the given directions * along the 2 edges to get to a deciding point (or NODES) and also puts * into prec the appropriate dependency (follows same convention as seg_cmp) */ static pair decide_point(segment* si, segment* sj, int dir1, int dir2) { int prec, ans = 0, temp; pair ret; segment* np1; segment* np2; while ((np1 = next_seg(si,dir1)) && (np2 = next_seg(sj,dir2)) && is_parallel(np1, np2)) { ans++; si = np1; sj = np2; } if (!np1) prec = 0; else if (!np2) assert(0); /* FIXME */ else { temp = seg_cmp(np1, np2); prec = propagate_prec(np1, temp, ans+1, 1-dir1); } ret.a = ans; ret.b = prec; return(ret); }
/** * Detects whether the first memory segment contains the other. * * @param[in] reg_addr starting address of original segment * @param[in] reg_len length of original segment * @param[in] oth_addr starting address of other segment * @param[in] oth_len length of other segment * * @pre NULL != reg_beg * @pre NULL != oth_beg * * @return RR_SUCCESS on success */ STATIC reg_return_t seg_contains(void *reg_addr, size_t reg_len, void *oth_addr, size_t oth_len) { /* preconditions */ COMEX_ASSERT(NULL != reg_addr); COMEX_ASSERT(NULL != oth_addr); return seg_cmp( reg_addr, reg_len, oth_addr, oth_len, TEST_FOR_CONTAINMENT); }
/** * Detects whether the first memory segment contains the other. * * @param[in] reg_addr starting address of original segment * @param[in] reg_len length of original segment * @param[in] oth_addr starting address of other segment * @param[in] oth_len length of other segment * * @pre NULL != reg_beg * @pre NULL != oth_beg * * @return RR_SUCCESS on success */ static reg_return_t seg_contains(void *reg_addr, size_t reg_len, void *oth_addr, size_t oth_len) { /* preconditions */ assert(NULL != reg_addr); assert(NULL != oth_addr); return seg_cmp( reg_addr, reg_len, oth_addr, oth_len, TEST_FOR_CONTAINMENT); }
/** * Detects whether two memory segments intersect. * * @param[in] reg_addr starting address of original segment * @param[in] reg_len length of original segment * @param[in] oth_addr starting address of other segment * @param[in] oth_len length of other segment * * @pre NULL != reg_beg * @pre NULL != oth_beg * * @return RR_SUCCESS on success */ STATIC reg_return_t seg_intersects(void *reg_addr, size_t reg_len, void *oth_addr, size_t oth_len) { /* preconditions */ COMEX_ASSERT(NULL != reg_addr); COMEX_ASSERT(NULL != oth_addr); return seg_cmp( reg_addr, reg_len, oth_addr, oth_len, TEST_FOR_INTERSECTION); }
/** * Detects whether two memory segments intersect. * * @param[in] reg_addr starting address of original segment * @param[in] reg_len length of original segment * @param[in] oth_addr starting address of other segment * @param[in] oth_len length of other segment * * @pre NULL != reg_beg * @pre NULL != oth_beg * * @return RR_SUCCESS on success */ static reg_return_t seg_intersects(void *reg_addr, size_t reg_len, void *oth_addr, size_t oth_len) { /* preconditions */ assert(NULL != reg_addr); assert(NULL != oth_addr); return seg_cmp( reg_addr, reg_len, oth_addr, oth_len, TEST_FOR_INTERSECTION); }
static void add_edges_in_G(channel* cp) { int x,y; segment** seg_list = cp->seg_list; int size = cp->cnt; rawgraph* G = cp->G; for(x=0;x+1<size;x++) { for(y=x+1;y<size;y++) { switch (seg_cmp(seg_list[x],seg_list[y])) { case 1: insert_edge(G,x,y); break; case 0: break; case -1: insert_edge(G,y,x); break; } } } }
bool seg_different(SEG *a, SEG *b) { return seg_cmp(a, b) != 0; }
bool seg_ge(SEG *a, SEG *b) { return seg_cmp(a, b) >= 0; }
bool seg_gt(SEG *a, SEG *b) { return seg_cmp(a, b) > 0; }
bool seg_le(SEG *a, SEG *b) { return seg_cmp(a, b) <= 0; }
bool seg_lt(SEG *a, SEG *b) { return seg_cmp(a, b) < 0; }
bool seg_same(SEG *a, SEG *b) { return seg_cmp(a, b) == 0; }