int _ses_path_cmp(const void* v0, const void* v1);
+static inline void __ses_ur_i(double* a, double* ja, double v, double jv, double r, double jr)
+{
+ double R = r * r + jr * jr;
+
+ *a = ( v * r + jv * jr) / R;
+ *ja = (jv * r - v * jr) / R;
+}
+
+static inline void __ses_ir_u(double* v, double* jv, double a, double ja, double r, double jr)
+{
+ *v = a * r - ja * jr;
+ *jv = ja * r + a * jr;
+}
+
static int __ses_path_jr(ScfEfunction* f, ses_path_t* path)
{
if (!path)
ScfEpin* p;
ScfEpin* p0;
ScfEpin* p1;
+ ScfEpin* p2;
ScfEpin* cp0;
ScfEpin* cp1;
int i;
int j;
+ int k;
p0 = path->pins->data[0];
p1 = path->pins->data[path->pins->size - 1];
p1->v = el->v;
p1->jv = el->jv;
- double R = path->r * path->r + path->jr * path->jr;
-
double v = p0->v - p1->v;
double jv = p0->jv - p1->jv;
+ double a = 0;
+ double ja = 0;
- double a = ( v * path->r + jv * path->jr) / R;
- double ja = (jv * path->r - v * path->jr) / R;
+ __ses_ur_i(&a, &ja, v, jv, path->r, path->jr);
scf_loge("path: %d, v: %lg + j%lg, r: %lg + j%lg, a: %lg + j%lg\n", path->index, v, jv, path->r, path->jr, a, ja);
for (i = 0; i < path->pins->size; i++) {
p = path->pins->data[i];
- v = a * p->pr - ja * p->jpr;
- jv = ja * p->pr + a * p->jpr;
+ if (path->childs) {
+ for (j = 0; j < path->childs->size; j++) {
+ child = path->childs->data[j];
+
+ cp0 = child->pins->data[0];
+ cp1 = child->pins->data[child->pins->size - 1];
+
+ if (p->lid != cp0->lid)
+ continue;
+
+ for (k = i + 1; k < path->pins->size; k++) {
+ p2 = path->pins->data[k];
+
+ if (p2->lid == cp1->lid)
+ break;
+ }
+
+ if (k >= path->pins->size)
+ return -EINVAL;
+
+ double _r = p2->pr - p->pr;
+ double _jr = p2->jpr - p->jpr;
+
+ double _v = 0;
+ double _jv = 0;
+ double _a = 0;
+ double _ja = 0;
+
+ __ses_ir_u(&_v, &_jv, a, ja, _r, _jr);
+ __ses_ur_i(&_a, &_ja, _v, _jv, child->r, child->jr);
+
+ el = f->elines[p2->lid];
+ el->v = p->v - _v;
+ el->jv = p->jv - _jv;
+
+// int ret = __ses_path_va(f, child);
+// if (ret < 0)
+// return ret;
+
+ a -= _a;
+ ja -= _ja;
+ }
+ }
+
+ __ses_ir_u(&v, &jv, a, ja, p->sr, p->jsr);
p->v = p0->v - v;
p->jv = p0->jv - jv;
dv -= p->v;
jdv -= p->jv;
- R = r * r + jr * jr;
- p->a = ( dv * r + jdv * jr) / R;
- p->ja = (jdv * r - dv * jr) / R;
+ __ses_ur_i(&p->a, &p->ja, dv, jdv, r, jr);
scf_loge("i: %d, c%ldp%ld, v: %lg + j%lg, p->v: %lg + j%lg, dv: %lg + j%lg, r: %lg + j%lg, a: %lg + j%lg\n\n", i, p->cid, p->id,
v, jv, p->v, p->jv, dv, jdv, r, jr, p->a, p->ja);
- r = 0;
- jr = 0;
+ r = 0;
+ jr = 0;
+
} else {
dv = p->v;
jdv = p->jv;
}
printf("\n");
- if (path->childs) {
-
- for (i = path->childs->size - 1; i >= 0; i--) {
- child = path->childs->data[i];
-
- int ret = __ses_path_va(f, child);
- if (ret < 0)
- return ret;
-
- }
- }
-
return 0;
}