From: yu.dongliang <18588496441@163.com>
Date: Sun, 5 Nov 2023 08:05:12 +0000 (+0800)
Subject: tmp
X-Git-Url: http://baseworks.info/?a=commitdiff_plain;h=eba374b8d933b45fdf16680ac8eb45702f4fd1e4;p=ses.git

tmp
---

diff --git a/ses_layout.c b/ses_layout.c
index f42d81c..572488f 100644
--- a/ses_layout.c
+++ b/ses_layout.c
@@ -20,6 +20,23 @@ int epin_cmp(const void* v0, const void* v1)
 	return 0;
 }
 
+int epin_cmp_color(const void* v0, const void* v1, void* arg)
+{
+	const uint64_t* t0 = v0;
+	const uint64_t* t1 = v1;
+
+	ScfEfunction*   f  = arg;
+	ScfEcomponent*  c0 = f->components[t0[0]];
+	ScfEcomponent*  c1 = f->components[t1[0]];
+
+	if (c0->color < c1->color)
+		return -1;
+
+	if (c0->color > c1->color)
+		return 1;
+	return 0;
+}
+
 int epin_cmp_cx(const void* v0, const void* v1, void* arg)
 {
 	const uint64_t* t0 = v0;
@@ -396,7 +413,7 @@ int ses_lines_diff_components(ScfEfunction* f, ses_graph_t* graph)
 
 	scf_vector_qsort(graph, ses_vertex_cmp_edges);
 
-#if 1
+#if 0
 	for (i = 0; i < graph->size; i++) {
 		v0        = graph->data[i];
 
@@ -428,7 +445,6 @@ static int __ses_layout_lines3(ScfEfunction* f)
 	intptr_t j;
 	intptr_t k;
 
-	scf_loge("\n");
 	ses_lines_diff_components(f, graph);
 
 	if (0  < graph->size) {
@@ -902,123 +918,125 @@ next:
 	return 0;
 }
 
-static void __ses_de_cross(ScfEfunction* f, int d)
+static int __ses_de_cross(ScfEfunction* f, int d)
 {
-	ScfEcomponent* c0;
-	ScfEcomponent* c1;
-	ScfEpin*       p0;
-	ScfEpin*       p1;
-	ScfEpin*       p2;
-	ScfEpin*       p3;
-
-	size_t i;
-	size_t j;
-	size_t k;
-	size_t m;
-	size_t n;
-	size_t q;
-
-	for (i = 0; i < f->n_components - 1; i++) {
-		c0 =        f->components[i];
-
-		for (j = 0; j < c0->n_pins - 1; j++) {
-			p0 =        c0->pins[j];
+	ScfEcomponent* c;
+	ScfEline*      el;
+	ScfEpin*       p;
+	ScfLine*       l0;
+	ScfLine*       l;
 
-			for (k = j + 1; k < c0->n_pins; k++) {
-				p1 =            c0->pins[k];
+	ses_vertex_t*  v;
+	scf_vector_t*  graph;
+	scf_vector_t*  colors;
 
-				if (p0->y - p1->y <= d && p0->y - p1->y >= -d)
-					continue;
+	graph = scf_vector_alloc();
+	if (!graph)
+		return -ENOMEM;
 
-				int y0 = p0->y < p1->y ? p0->y : p1->y;
-				int y1 = p0->y < p1->y ? p1->y : p0->y;
+	colors = scf_vector_alloc();
+	if (!colors) {
+		scf_vector_free(graph);
+		return -ENOMEM;
+	}
 
-				for (m = i + 1; m < f->n_components; m++) {
-					c1 =            f->components[m];
+	intptr_t N = 2;
+	intptr_t i;
+	intptr_t j;
 
-					for (n = 0; n < c1->n_pins - 1; n++) {
-						p2 =        c1->pins[n];
+	int ret = __ses_get_crosses(f, d, graph);
+	if (ret < 0)
+		return ret;
 
-						for (q = n + 1; q < c1->n_pins; q++) {
-							p3 =            c1->pins[q];
+	if (0  < graph->size) {
+		v  = graph->data[0];
 
-							if (p2->y - p3->y <= d && p2->y - p3->y >= -d)
-								continue;
+		N  = v->edges->size;
+	}
 
-							int y2 = p2->y < p3->y ? p2->y : p3->y;
-							int y3 = p2->y < p3->y ? p3->y : p2->y;
+	for (j = N; j >= 1; j--) {
 
-							if (y0 < y2 && y2 < y1 && y1 < y3) {
+		for (i = 1; i <= j; i++)
+			scf_vector_add(colors, (void*)i);
 
-								if (p2->x > 0)
-									__ses_flip_neg(c0);
+		int ret = ses_graph_kcolor(graph, j, colors);
+		if (ret < 0) {
+			scf_loge("**********\n");
+		}
 
-							} else if (y2 < y0 && y0 < y3 && y3 < y1) {
+		for (i = 0; i < graph->size; i++) {
+			v         = graph->data[i];
 
-								if (p0->x > 0)
-									__ses_flip_neg(c1);
-							}
-						}
-					}
-				}
+			if (v->color < 0) {
+				c = v->data;
+				scf_loge("j: %ld, i: %ld, c%ld->color: %ld\n", j, i, c->id, v->color);
+				break;
 			}
 		}
-	}
 
-	for (i = 0; i < f->n_components; i++) {
-		c0 =        f->components[i];
+		if (i < graph->size)
+			break;
 
-		for (j = 0; j < c0->n_pins - 1; j++) {
-			p0 =        c0->pins[j];
+		for (i = 0; i < graph->size; i++) {
+			v         = graph->data[i];
 
-			if (p0->x > 0)
-				continue;
+			c        = v->data;
+			c->color = v->color;
+			v->color = 0;
+		}
 
-			for (k = j + 1; k < c0->n_pins; k++) {
-				p1 =            c0->pins[k];
+		scf_vector_clear(colors, NULL);
+	}
 
-				if (p1->x > 0)
-					continue;
+	scf_vector_clear(graph, ( void (*)(void*) )ses_vertex_free);
+	scf_vector_free(graph);
+	scf_vector_free(colors);
+	colors = NULL;
+	graph  = NULL;
 
-				int y0 = p0->y < p1->y ? p0->y : p1->y;
-				int y1 = p0->y < p1->y ? p1->y : p0->y;
+	for (i = 0; i < f->n_elines; i++) {
+		el =        f->elines[i];
 
-				for (m = 0; m < f->n_components; m++) {
-					c1 =        f->components[m];
+		qsort_r(el->pins, el->n_pins / 2, sizeof(uint64_t) * 2, epin_cmp_color, f);
 
-					if (c0 == c1)
-						continue;
+		for (j = 0; j + 1 < el->n_pins; j += 2) {
 
-					for (n = 0; n < c1->n_pins - 1; n++) {
-						p2 =        c1->pins[n];
+			c  = f->components[el->pins[j]];
+			p  = c->pins      [el->pins[j + 1]];
 
-						if (p2->x < 0)
-							continue;
+			intptr_t k = (c->color - 1) / 2;
+			intptr_t m = (c->color - 1) % 2;
 
-						for (q = n + 1; q < c1->n_pins; q++) {
-							p3 =            c1->pins[q];
+			while (el->n_lines <= k) {
 
-							if (p3->x < 0)
-								continue;
+				l0 = el->lines[el->n_lines - 1];
 
-							if (p2->y - p3->y <= d && p2->y - p3->y >= -d)
-								continue;
+				l = malloc(sizeof(ScfLine));
+				if (!l)
+					return -ENOMEM;
 
-							int y2 = p2->y < p3->y ? p2->y : p3->y;
-							int y3 = p2->y < p3->y ? p3->y : p2->y;
+				l->x0 = l0->x1 + d;
+				l->x1 = l->x0;
+				l->y0 = l0->y0;
+				l->y1 = l0->y1;
 
-							if ((y0 < y2 && y2 < y1 && y1 < y3) || (y2 < y0 && y0 < y3 && y3 < y1))
-								goto next;
-						}
-					}
+				if (scf_eline__add_line(el, l) < 0) {
+					free(l);
+					return -ENOMEM;
 				}
 			}
-		}
 
-		__ses_flip_pos(c0);
-next:
-		c0 = NULL;
+			l     = el->lines[k];
+
+			if (0 == m)
+				p->x = l->x0 + d;
+			else
+				p->x = l->x1 + d;
+			l->x1 = p->x;
+		}
 	}
+
+	return 0;
 }
 
 static void __ses_setc_xy(ScfEfunction* f, int d)
@@ -1286,75 +1304,6 @@ static void __ses_mov_pos(ScfEfunction* f, int d)
 	}
 }
 
-int ses_cross(ScfEfunction* f, int d)
-{
-	ScfEcomponent* c;
-
-	ses_vertex_t*  vc;
-
-	scf_vector_t*  graph  = scf_vector_alloc();
-	scf_vector_t*  colors = scf_vector_alloc();
-
-	intptr_t N = 2;
-	intptr_t i;
-	intptr_t j;
-
-	scf_loge("\n");
-	__ses_get_crosses(f, d, graph);
-
-	if (0  < graph->size) {
-		vc = graph->data[0];
-
-		N = vc->edges->size;
-	}
-
-	for (j = N; j >= 0; j--) {
-
-		for (i = 1; i <= j; i++)
-			scf_vector_add(colors, (void*)i);
-
-		int ret = ses_graph_kcolor(graph, j, colors);
-		if (ret < 0) {
-			scf_loge("**********\n");
-		}
-
-		for (i = 0; i < graph->size; i++) {
-			vc        = graph->data[i];
-
-			if (vc->color < 0) {
-				c = vc->data;
-				scf_loge("j: %ld, i: %ld, c%ld->color: %ld\n", j, i, c->id, vc->color);
-				break;
-			}
-		}
-
-		if (i < graph->size)
-			break;
-
-		for (i = 0; i < graph->size; i++) {
-			vc        = graph->data[i];
-
-			c         = vc->data;
-			c->color  = vc->color;
-			vc->color = 0;
-		}
-
-		scf_vector_clear(colors, NULL);
-		printf("\n");
-	}
-
-	for (i = 0; i < graph->size; i++) {
-		vc        = graph->data[i];
-
-		c = vc->data;
-		scf_logi("i: %ld, c%ld->color: %ld\n", i, c->id, c->color);
-	}
-
-	scf_vector_clear(graph, ( void (*)(void*) )ses_vertex_free);
-	scf_vector_free(graph);
-	scf_vector_free(colors);
-}
-
 int ses_layout_function(ScfEfunction* f, int d)
 {
 	ScfEcomponent* c;
@@ -1384,15 +1333,15 @@ int ses_layout_function(ScfEfunction* f, int d)
 
 	qsort(f->elines, f->n_elines, sizeof(ScfEline*), eline_cmp_id);
 
-//	ses_cross(f, d);
-
-	__ses_de_cross(f, d);
+	ret = __ses_de_cross(f, d);
+	if (ret < 0)
+		return ret;
 
 	__ses_setc_xy(f, d);
-	__ses_xchg_cx(f, d);
-	__ses_xchg_ce(f, d);
+//	__ses_xchg_cx(f, d);
+//	__ses_xchg_ce(f, d);
 
-	__ses_mov_pos(f, d);
+//	__ses_mov_pos(f, d);
 	__ses_layout_cx(f, d);
 
 	int tx0 = INT_MAX;
@@ -1401,29 +1350,29 @@ int ses_layout_function(ScfEfunction* f, int d)
 	for (i = 0; i < f->n_elines; i++) {
 		el        = f->elines[i];
 
-		int x0 = INT_MAX;
-		int x1 = 0;
-
 		for (j = 0; j < el->n_pins; j += 2) {
 
 			c  = f->components[el->pins[j]];
 			p0 = c->pins      [el->pins[j + 1]];
 
-			if (x0 > p0->x)
-				x0 = p0->x;
+			if (tx0 > p0->x)
+				tx0 = p0->x;
 
-			if (x1 < p0->x)
-				x1 = p0->x;
-		}
+			if (tx1 < p0->x)
+				tx1 = p0->x;
 
-		el->lines[0]->x0 = x0;
-		el->lines[0]->x1 = x1;
+			intptr_t k = (c->color - 1) / 2;
 
-		if (tx0 > x0)
-			tx0 = x0;
+			if (el->lines[k]->x0 > p0->x)
+				el->lines[k]->x0 = p0->x;
 
-		if (tx1 < x1)
-			tx1 = x1;
+			if (el->lines[k]->x1 < p0->x)
+				el->lines[k]->x1 = p0->x;
+		}
+
+		for (j = 0; j < el->n_lines; j++)
+			scf_logi("l%ld->lines[%ld]: x0: %d, x1: %d\n", el->id, j, el->lines[j]->x0, el->lines[j]->x1);
+		printf("\n");
 	}
 
 	f->w  = tx1 + d;