From 5ca628d59da1160227ccf9c6b4b70032bebcead9 Mon Sep 17 00:00:00 2001 From: "yu.dongliang" <18588496441@163.com> Date: Tue, 10 Oct 2023 17:28:22 +0800 Subject: [PATCH] __ses_path_va_balance() --- Makefile | 2 +- ses_step_va_balance.c | 81 +++++++- ses_steps.c | 442 ----------------------------------------- ses_utils.c | 445 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 524 insertions(+), 446 deletions(-) create mode 100644 ses_utils.c diff --git a/Makefile b/Makefile index 730e426..7314e59 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ CFILES += main.c CFILES += scf_eda.pb-c.c CFILES += scf_eda_pb.c CFILES += ses_layout.c -CFILES += ses_loop.c +CFILES += ses_utils.c CFILES += ses_steps.c CFILES += ses_step_battery.c diff --git a/ses_step_va_balance.c b/ses_step_va_balance.c index 3829bfb..5365b9a 100644 --- a/ses_step_va_balance.c +++ b/ses_step_va_balance.c @@ -67,6 +67,67 @@ static void inline __ses_bridge_i(double* i0, double* i1, double* i2, double* i3 *v4 = *i4 * R4 + vd4; } +static size_t __ses_line_update(ScfEfunction* f, ScfEline* el) +{ + ScfEcomponent* c; + ScfEpin* p; + ScfEpin* p2; + + size_t n = 0; + size_t i; + + for (i = 0; i + 1 < el->n_pins; i += 2) { + + c = f->components[el->pins[i]]; + p = c->pins [el->pins[i + 1]]; + p->v = el->v; + + if (SCF_EDA_Diode == c->type) { + + if (SCF_EDA_Diode_POS == p->id) { + + p2 = c->pins[SCF_EDA_Diode_NEG]; + + if (p->v - p2->v < SCF_EDA_V_Diode_ON) { + c->status = SCF_EDA_Status_OFF; + n++; + } + + } else { + p2 = c->pins[SCF_EDA_Diode_POS]; + + if (p2->v - p->v < SCF_EDA_V_Diode_ON) { + c->status = SCF_EDA_Status_OFF; + n++; + } + } + + } else if (SCF_EDA_Transistor == c->type) { + + if (SCF_EDA_Transistor_B == p->id) { + + p2 = c->pins[SCF_EDA_Transistor_E]; + + if (p->v - p2->v < SCF_EDA_V_Diode_ON) { + c->status = SCF_EDA_Status_OFF; + n++; + } + + } else if (SCF_EDA_Transistor_E == p->id) { + + p2 = c->pins[SCF_EDA_Transistor_B]; + + if (p2->v - p->v < SCF_EDA_V_Diode_ON) { + c->status = SCF_EDA_Status_OFF; + n++; + } + } + } + } + + return n; +} + static int __ses_path_va_balance(ScfEfunction* f, ses_path_t* bridge, ses_flow_t* flow0, ses_flow_t* flow1) { if (!bridge || !flow0 || !flow1) @@ -124,9 +185,6 @@ static int __ses_path_va_balance(ScfEfunction* f, ses_path_t* bridge, ses_flow_t 0, 0, 0, 0, bridge->n_diodes * SCF_EDA_V_Diode_ON); -// ses_flow_v_pos(flow0, a, ja); -// ses_flow_v_neg(flow1, a, ja); - scf_loge("r0: %lg, r1: %lg, r2: %lg, r3: %lg, r4: %lg\n", flow1->pr, flow0->pr, flow1->nr, flow0->nr, bridge->r); @@ -134,6 +192,17 @@ static int __ses_path_va_balance(ScfEfunction* f, ses_path_t* bridge, ses_flow_t scf_loge("v: %lg, a0: %lg, a1: %lg, a2: %lg, a3: %lg, a4: %lg\n", v, a0, a1, a2, a3, a4); scf_loge("v0: %lg, v1: %lg, v4: %lg, v1 - v0: %lg\n", v0, v1, v4, v1 - v0); + el = f->elines[p0->lid]; + el->v = v0; + + el = f->elines[p1->lid]; + el->v = v1; + + size_t n0 = __ses_line_update(f, f->elines[p0->lid]); + size_t n1 = __ses_line_update(f, f->elines[p1->lid]); + + return n0 + n1 > 0; + } else { } @@ -169,6 +238,7 @@ static int _va_balance_handler(ScfEfunction* f, int64_t ns, int64_t count, ses_c return -ENOMEM; } + int n = 0; int i; for (i = 0; i < ctx->paths->size; i++) { @@ -217,11 +287,16 @@ static int _va_balance_handler(ScfEfunction* f, int64_t ns, int64_t count, ses_c if (ret < 0) return ret; + n += ret; + printf("\n"); } ses_flow_free(flow0); ses_flow_free(flow1); + + if (n > 0) + return -EAGAIN; return 0; } diff --git a/ses_steps.c b/ses_steps.c index d36aa1a..4e75ddb 100644 --- a/ses_steps.c +++ b/ses_steps.c @@ -45,448 +45,6 @@ static ses_step_t* ses_steps[] = &ses_step_output, }; -ses_flow_t* ses_flow_alloc() -{ - ses_flow_t* flow = calloc(1, sizeof(ses_flow_t)); - if (!flow) - return NULL; - - flow->paths = scf_vector_alloc(); - if (!flow->paths) { - ses_flow_free(flow); - return NULL; - } - - return flow; -} - -void ses_flow_free(ses_flow_t* flow) -{ - if (flow) { - if (flow->paths) - scf_vector_free(flow->paths); - - free(flow); - } -} - -void ses_flow_v_pos(ses_flow_t* flow, double a, double ja) -{ - if (!flow || !flow->paths || flow->paths->size <= 0 || !flow->vip) - return; - - ses_path_t* path = flow->paths->data[flow->paths->size - 1]; - ScfEpin* vip = flow->vip; - ScfEpin* p0; - ScfEpin* p; - - double tr = flow->pr; - double jtr = flow->jpr; - - int i; - int j; - - for (i = 0; i < flow->paths->size; i++) { - path = flow->paths->data[i]; - - double v; - double jv; - - p0 = NULL; - for (j = path->pins->size - 1; j >= 0; j--) { - p = path->pins->data[j]; - - if (!p0) { - if ((j & 0x1) && p->lid == vip->lid) - p0 = p; - else - continue; - } - - double r = tr - (p0->pr - p->pr); - double jr = jtr - (p0->jpr - p->jpr); - - ses_ir_u(&v, &jv, a, ja, r, jr); - - p->v -= v; - p->jv -= jv; - - scf_logw("c%ldp%ld->v: %lg + j%lg, r: %lg + j%lg\n", p->cid, p->id, p->v, p->jv, r, jr); - break; - } - - assert(p0); - - vip = path->pins->data[0]; - tr -= p0->pr; - jtr -= p0->jpr; - - ses_ir_u(&v, &jv, a, ja, tr, jtr); - - vip->v -= v; - vip->jv -= jv; - - scf_logw("c%ldp%ld->v: %lg + j%lg, r: %lg + j%lg\n", vip->cid, vip->id, vip->v, vip->jv, tr, jtr); - } -} - -void ses_flow_v_neg(ses_flow_t* flow, double a, double ja) -{ - if (!flow || !flow->paths || flow->paths->size <= 0 || !flow->vip) - return; - - ses_path_t* path = flow->paths->data[flow->paths->size - 1]; - ScfEpin* vip = flow->vip; - ScfEpin* p0; - ScfEpin* p; - - double tr = flow->nr; - double jtr = flow->jnr; - - int i; - int j; - - for (i = 0; i < flow->paths->size; i++) { - path = flow->paths->data[i]; - - double v; - double jv; - - p0 = NULL; - for (j = 0; j < path->pins->size; j++) { - p = path->pins->data[j]; - - if (!p0) { - if (p->lid == vip->lid) - p0 = p; - else - continue; - } - - double r = tr - (p->sr - p0->pr); - double jr = jtr - (p->jsr - p0->jpr); - - if (p->sr != p->pr) - p0 = p; - - ses_ir_u(&v, &jv, a, ja, r, jr); - - p->v += v; - p->jv += jv; - - scf_loge("c%ldp%ld->v: %lg + j%lg, r: %lg + j%lg, %lg\n", p->cid, p->id, p->v, p->jv, r, jr, p->sr); - } - - assert(p0); - - vip = path->pins->data[j - 1]; - - if (vip != p0) { - - tr -= vip->sr - p0->pr; - jtr -= vip->jsr - p0->jpr; - - ses_ir_u(&v, &jv, a, ja, tr, jtr); - - vip->v += v; - vip->jv += jv; - - scf_logw("c%ldp%ld->v: %lg + j%lg, r: %lg + j%lg\n", vip->cid, vip->id, vip->v, vip->jv, tr, jtr); - } - } -} - -void ses_flow_jr(ses_flow_t* flow) -{ - if (!flow) - return; - - flow->pr = 0; - flow->jpr = 0; - - flow->nr = 0; - flow->jnr = 0; - - if (!flow->paths || !flow->vip) - return; - - ses_path_t* path; - ScfEpin* p; - ScfEpin* p0; - ScfEpin* vip = flow->vip; - - int i; - int j; - - for (i = 0; i < flow->paths->size; i++) { - path = flow->paths->data[i]; - - for (j = 0; j < path->pins->size; j++) { - p = path->pins->data[j]; - - if (p->lid == vip->lid) { - - vip = path->pins->data[0]; - - flow->pr += p->pr; - flow->jpr += p->jpr; - - scf_loge("flow->pr: %lg, c%ldp%ld->pr: %lg, vip c%ldp%ld->pr: %lg\n", - flow->pr, p->cid, p->id, p->pr, vip->cid, vip->id, vip->pr); - break; - } - } - } - - vip = flow->vip; - - for (i = 0; i < flow->paths->size; i++) { - path = flow->paths->data[i]; - - p0 = NULL; - for (j = 0; j < path->pins->size; j++) { - p = path->pins->data[j]; - - if (!p0) { - if (p->lid == vip->lid) - p0 = p; - continue; - } - - if (p->sr != p->pr) { - - flow->nr += p->sr - p0->pr; - flow->jnr += p->jsr - p0->jpr; - - scf_logw("flow->nr: %lg, c%ldp%ld->sr: %lg, p0 c%ldp%ld->pr: %lg\n", - flow->nr, p->cid, p->id, p->sr, p0->cid, p0->id, p0->pr); - - p0 = p; - } - } - - assert(p0); - - vip = path->pins->data[j - 1]; - - if (vip != p0) { - flow->nr += vip->sr - p0->pr; - flow->jnr += vip->jsr - p0->jpr; - } - - scf_loge("flow->nr: %lg, vip c%ldp%ld->sr: %lg, p0 c%ldp%ld->pr: %lg\n", - flow->nr, vip->cid, vip->id, vip->sr, p0->cid, p0->id, p0->pr); - } -} - -void ses_flow_print(ses_flow_t* flow) -{ - if (!flow || !flow->paths || !flow->vip) - return; - - ses_path_t* path; - ScfEpin* p; - ScfEpin* vip = flow->vip; - - int i; - int j; - - for (i = 0; i < flow->paths->size; i++) { - path = flow->paths->data[i]; - - for (j = 0; j < path->pins->size; j++) { - p = path->pins->data[j]; - - printf("c%ldp%ld ", p->cid, p->id); - - if (p->lid == vip->lid) { - vip = path->pins->data[0]; - break; - } - } - printf(", "); - } - - printf(";\n"); - - vip = flow->vip; - - for (i = 0; i < flow->paths->size; i++) { - path = flow->paths->data[i]; - - int flag = 0; - - for (j = 0; j < path->pins->size; j++) { - p = path->pins->data[j]; - - if (!flag) { - if (p->lid == vip->lid) - flag = 1; - continue; - } - - printf("c%ldp%ld ", p->cid, p->id); - } - - printf(", "); - - vip = path->pins->data[j - 1]; - } - - printf(".\n"); -} - -ses_path_t* ses_path_alloc() -{ - ses_path_t* path = calloc(1, sizeof(ses_path_t)); - if (!path) - return NULL; - - path->pins = scf_vector_alloc(); - if (!path->pins) { - free(path); - return NULL; - } - - return path; -} - -void ses_path_free(ses_path_t* path) -{ - if (path) { - if (path->pins) - scf_vector_free(path->pins); - - if (path->childs) { - scf_vector_clear(path->childs, ( void (*)(void*) )ses_path_free); - scf_vector_free (path->childs); - } - - free(path); - } -} - -void ses_path_print(ses_path_t* path) -{ - if (!path) - return; - - ses_path_t* path2; - ScfEpin* p; - - int i; - - if (!path->parent) - printf("\033[31mpath: %d, n_diodes: %d, \033[0m", path->index, path->n_diodes); - - for (i = 0; i < path->pins->size; i++) { - p = path->pins->data[i]; - - printf("c%ldp%ldd%d ", p->cid, p->id, p->n_diodes); - } - printf("\n"); - - if (!path->childs) - return; - - for (i = 0; i < path->childs->size; i++) { - path2 = path->childs->data[i]; - - printf("\033[32mchild: %d, n_diodes: %d, parent: %d, \033[0m", path2->index, path2->n_diodes, path->index); - - ses_path_print(path2); - } -} - -int ses_path_add(ses_path_t* parent, ses_path_t* child) -{ - if (!parent || !child) - return -EINVAL; - - if (!parent->childs) { - parent->childs = scf_vector_alloc(); - if (!parent->childs) - return -ENOMEM; - } - - ses_path_t* path; - ScfEpin* p0; - ScfEpin* p1; - ScfEpin* cp0 = child->pins->data[0]; - ScfEpin* cp1 = child->pins->data[child->pins->size - 1]; - - int j; - - for (j = 0; j < parent->childs->size; j++) { - path = parent->childs->data[j]; - - p0 = path->pins->data[0]; - p1 = path->pins->data[path->pins->size - 1]; - - if (p0->lid == cp0->lid && p1->lid == cp1->lid) { - - if (child->pins->size == child->n_diodes * 2 - && path->pins->size > path->n_diodes * 2) { - - parent->childs->data[j] = child; - child->parent = parent; - child->parent_p0 = path->parent_p0; - child->parent_p1 = path->parent_p1; - child->type = SES_PATH_BRANCH; - - return ses_path_add(child, path); - } else - return ses_path_add(path, child); - } - } - - if (scf_vector_add(parent->childs, child) < 0) - return -ENOMEM; - - for (j = 0; j < parent->pins->size; j++) { - p0 = parent->pins->data[j]; - - if (p0->lid == cp0->lid) - child->parent_p0 = j; - - if (p0->lid == cp1->lid) { - child->parent_p1 = j; - break; - } - } - assert(child->parent_p0 >= 0 && child->parent_p1 >= 0); - - child->parent = parent; - child->type = SES_PATH_BRANCH; - return 0; -} - -ses_ctx_t* ses_ctx_alloc() -{ - ses_ctx_t* ctx = calloc(1, sizeof(ses_ctx_t)); - if (!ctx) - return NULL; - - ctx->paths = scf_vector_alloc(); - if (!ctx->paths) { - free(ctx); - return NULL; - } - - return ctx; -} - -void ses_ctx_free(ses_ctx_t* ctx) -{ - if (ctx) { - if (ctx->paths) { - scf_vector_clear(ctx->paths, ( void (*)(void*) )scf_vector_free); - scf_vector_free (ctx->paths); - } - - free(ctx); - } -} int ses_steps_analyse(ScfEfunction* f, int64_t ns, int64_t count) { diff --git a/ses_utils.c b/ses_utils.c new file mode 100644 index 0000000..bfa53a7 --- /dev/null +++ b/ses_utils.c @@ -0,0 +1,445 @@ +#include"ses_core.h" + +ses_flow_t* ses_flow_alloc() +{ + ses_flow_t* flow = calloc(1, sizeof(ses_flow_t)); + if (!flow) + return NULL; + + flow->paths = scf_vector_alloc(); + if (!flow->paths) { + ses_flow_free(flow); + return NULL; + } + + return flow; +} + +void ses_flow_free(ses_flow_t* flow) +{ + if (flow) { + if (flow->paths) + scf_vector_free(flow->paths); + + free(flow); + } +} + +void ses_flow_v_pos(ses_flow_t* flow, double a, double ja) +{ + if (!flow || !flow->paths || flow->paths->size <= 0 || !flow->vip) + return; + + ses_path_t* path = flow->paths->data[flow->paths->size - 1]; + ScfEpin* vip = flow->vip; + ScfEpin* p0; + ScfEpin* p; + + double tr = flow->pr; + double jtr = flow->jpr; + + int i; + int j; + + for (i = 0; i < flow->paths->size; i++) { + path = flow->paths->data[i]; + + double v; + double jv; + + p0 = NULL; + for (j = path->pins->size - 1; j >= 0; j--) { + p = path->pins->data[j]; + + if (!p0) { + if ((j & 0x1) && p->lid == vip->lid) + p0 = p; + else + continue; + } + + double r = tr - (p0->pr - p->pr); + double jr = jtr - (p0->jpr - p->jpr); + + ses_ir_u(&v, &jv, a, ja, r, jr); + + p->v -= v; + p->jv -= jv; + + scf_logw("c%ldp%ld->v: %lg + j%lg, r: %lg + j%lg\n", p->cid, p->id, p->v, p->jv, r, jr); + break; + } + + assert(p0); + + vip = path->pins->data[0]; + tr -= p0->pr; + jtr -= p0->jpr; + + ses_ir_u(&v, &jv, a, ja, tr, jtr); + + vip->v -= v; + vip->jv -= jv; + + scf_logw("c%ldp%ld->v: %lg + j%lg, r: %lg + j%lg\n", vip->cid, vip->id, vip->v, vip->jv, tr, jtr); + } +} + +void ses_flow_v_neg(ses_flow_t* flow, double a, double ja) +{ + if (!flow || !flow->paths || flow->paths->size <= 0 || !flow->vip) + return; + + ses_path_t* path = flow->paths->data[flow->paths->size - 1]; + ScfEpin* vip = flow->vip; + ScfEpin* p0; + ScfEpin* p; + + double tr = flow->nr; + double jtr = flow->jnr; + + int i; + int j; + + for (i = 0; i < flow->paths->size; i++) { + path = flow->paths->data[i]; + + double v; + double jv; + + p0 = NULL; + for (j = 0; j < path->pins->size; j++) { + p = path->pins->data[j]; + + if (!p0) { + if (p->lid == vip->lid) + p0 = p; + else + continue; + } + + double r = tr - (p->sr - p0->pr); + double jr = jtr - (p->jsr - p0->jpr); + + if (p->sr != p->pr) + p0 = p; + + ses_ir_u(&v, &jv, a, ja, r, jr); + + p->v += v; + p->jv += jv; + + scf_loge("c%ldp%ld->v: %lg + j%lg, r: %lg + j%lg, %lg\n", p->cid, p->id, p->v, p->jv, r, jr, p->sr); + } + + assert(p0); + + vip = path->pins->data[j - 1]; + + if (vip != p0) { + + tr -= vip->sr - p0->pr; + jtr -= vip->jsr - p0->jpr; + + ses_ir_u(&v, &jv, a, ja, tr, jtr); + + vip->v += v; + vip->jv += jv; + + scf_logw("c%ldp%ld->v: %lg + j%lg, r: %lg + j%lg\n", vip->cid, vip->id, vip->v, vip->jv, tr, jtr); + } + } +} + +void ses_flow_jr(ses_flow_t* flow) +{ + if (!flow) + return; + + flow->pr = 0; + flow->jpr = 0; + + flow->nr = 0; + flow->jnr = 0; + + if (!flow->paths || !flow->vip) + return; + + ses_path_t* path; + ScfEpin* p; + ScfEpin* p0; + ScfEpin* vip = flow->vip; + + int i; + int j; + + for (i = 0; i < flow->paths->size; i++) { + path = flow->paths->data[i]; + + for (j = 0; j < path->pins->size; j++) { + p = path->pins->data[j]; + + if (p->lid == vip->lid) { + + vip = path->pins->data[0]; + + flow->pr += p->pr; + flow->jpr += p->jpr; + + scf_loge("flow->pr: %lg, c%ldp%ld->pr: %lg, vip c%ldp%ld->pr: %lg\n", + flow->pr, p->cid, p->id, p->pr, vip->cid, vip->id, vip->pr); + break; + } + } + } + + vip = flow->vip; + + for (i = 0; i < flow->paths->size; i++) { + path = flow->paths->data[i]; + + p0 = NULL; + for (j = 0; j < path->pins->size; j++) { + p = path->pins->data[j]; + + if (!p0) { + if (p->lid == vip->lid) + p0 = p; + continue; + } + + if (p->sr != p->pr) { + + flow->nr += p->sr - p0->pr; + flow->jnr += p->jsr - p0->jpr; + + scf_logw("flow->nr: %lg, c%ldp%ld->sr: %lg, p0 c%ldp%ld->pr: %lg\n", + flow->nr, p->cid, p->id, p->sr, p0->cid, p0->id, p0->pr); + + p0 = p; + } + } + + assert(p0); + + vip = path->pins->data[j - 1]; + + if (vip != p0) { + flow->nr += vip->sr - p0->pr; + flow->jnr += vip->jsr - p0->jpr; + } + + scf_loge("flow->nr: %lg, vip c%ldp%ld->sr: %lg, p0 c%ldp%ld->pr: %lg\n", + flow->nr, vip->cid, vip->id, vip->sr, p0->cid, p0->id, p0->pr); + } +} + +void ses_flow_print(ses_flow_t* flow) +{ + if (!flow || !flow->paths || !flow->vip) + return; + + ses_path_t* path; + ScfEpin* p; + ScfEpin* vip = flow->vip; + + int i; + int j; + + for (i = 0; i < flow->paths->size; i++) { + path = flow->paths->data[i]; + + for (j = 0; j < path->pins->size; j++) { + p = path->pins->data[j]; + + printf("c%ldp%ld ", p->cid, p->id); + + if (p->lid == vip->lid) { + vip = path->pins->data[0]; + break; + } + } + printf(", "); + } + + printf(";\n"); + + vip = flow->vip; + + for (i = 0; i < flow->paths->size; i++) { + path = flow->paths->data[i]; + + int flag = 0; + + for (j = 0; j < path->pins->size; j++) { + p = path->pins->data[j]; + + if (!flag) { + if (p->lid == vip->lid) + flag = 1; + continue; + } + + printf("c%ldp%ld ", p->cid, p->id); + } + + printf(", "); + + vip = path->pins->data[j - 1]; + } + + printf(".\n"); +} + +ses_path_t* ses_path_alloc() +{ + ses_path_t* path = calloc(1, sizeof(ses_path_t)); + if (!path) + return NULL; + + path->pins = scf_vector_alloc(); + if (!path->pins) { + free(path); + return NULL; + } + + return path; +} + +void ses_path_free(ses_path_t* path) +{ + if (path) { + if (path->pins) + scf_vector_free(path->pins); + + if (path->childs) { + scf_vector_clear(path->childs, ( void (*)(void*) )ses_path_free); + scf_vector_free (path->childs); + } + + free(path); + } +} + +void ses_path_print(ses_path_t* path) +{ + if (!path) + return; + + ses_path_t* path2; + ScfEpin* p; + + int i; + + if (!path->parent) + printf("\033[31mpath: %d, n_diodes: %d, \033[0m", path->index, path->n_diodes); + + for (i = 0; i < path->pins->size; i++) { + p = path->pins->data[i]; + + printf("c%ldp%ldd%d ", p->cid, p->id, p->n_diodes); + } + printf("\n"); + + if (!path->childs) + return; + + for (i = 0; i < path->childs->size; i++) { + path2 = path->childs->data[i]; + + printf("\033[32mchild: %d, n_diodes: %d, parent: %d, \033[0m", path2->index, path2->n_diodes, path->index); + + ses_path_print(path2); + } +} + +int ses_path_add(ses_path_t* parent, ses_path_t* child) +{ + if (!parent || !child) + return -EINVAL; + + if (!parent->childs) { + parent->childs = scf_vector_alloc(); + if (!parent->childs) + return -ENOMEM; + } + + ses_path_t* path; + ScfEpin* p0; + ScfEpin* p1; + ScfEpin* cp0 = child->pins->data[0]; + ScfEpin* cp1 = child->pins->data[child->pins->size - 1]; + + int j; + + for (j = 0; j < parent->childs->size; j++) { + path = parent->childs->data[j]; + + p0 = path->pins->data[0]; + p1 = path->pins->data[path->pins->size - 1]; + + if (p0->lid == cp0->lid && p1->lid == cp1->lid) { + + if (child->pins->size == child->n_diodes * 2 + && path->pins->size > path->n_diodes * 2) { + + parent->childs->data[j] = child; + child->parent = parent; + child->parent_p0 = path->parent_p0; + child->parent_p1 = path->parent_p1; + child->type = SES_PATH_BRANCH; + + return ses_path_add(child, path); + } else + return ses_path_add(path, child); + } + } + + if (scf_vector_add(parent->childs, child) < 0) + return -ENOMEM; + + for (j = 0; j < parent->pins->size; j++) { + p0 = parent->pins->data[j]; + + if (p0->lid == cp0->lid) + child->parent_p0 = j; + + if (p0->lid == cp1->lid) { + child->parent_p1 = j; + break; + } + } + assert(child->parent_p0 >= 0 && child->parent_p1 >= 0); + + child->parent = parent; + child->type = SES_PATH_BRANCH; + return 0; +} + +ses_ctx_t* ses_ctx_alloc() +{ + ses_ctx_t* ctx = calloc(1, sizeof(ses_ctx_t)); + if (!ctx) + return NULL; + + ctx->paths = scf_vector_alloc(); + if (!ctx->paths) { + free(ctx); + return NULL; + } + + return ctx; +} + +void ses_ctx_free(ses_ctx_t* ctx) +{ + if (ctx) { + if (ctx->paths) { + scf_vector_clear(ctx->paths, ( void (*)(void*) )scf_vector_free); + scf_vector_free (ctx->paths); + } + + free(ctx); + } +} + -- 2.25.1