clock-graph.5c revision 03b705cf
1autoload Cairo;
2import Cairo;
3library "examples/sort.5c";
4import Sort;
5
6int width = 1000, height = 200;
7int min_vco = 1400000000;
8int max_vco = 2800000000;
9int min = 0xffffffff;
10int max = 0;
11
12int max_clocks = 2000;
13int[4][max_clocks] clocks;
14int[4][max_clocks] vcos;
15int[4] clock_count = {0...};
16
17int[4] p2vals = {5,10,7,14};
18
19cairo_t cr = Cairo::new(width, height);
20
21void calc_p2(int p2i)
22{
23	int p2 = p2vals[p2i];
24	int min_p, max_p;
25
26	clocks[p2i] = (int [max_clocks]){0...};
27
28		if (p2 == 7 || p2 == 14) {
29		/* LVDS */
30		min_p = 7;
31		max_p = 98;
32	} else {
33		/* SDVO/DAC */
34		min_p = 5;
35		max_p = 80;
36	}
37
38	for (int m1 = 10; m1 <= 22; m1++) {
39		for (int m2 = 5; m2 <= 9; m2++) {
40			for (int n = 1; n <= 5; n++) {
41				for (int p1 = 1; p1 <= 8; p1++) {
42					int ref = 96000000;
43					int m = 5 * (m1 + 2) + (m2 + 2);
44					int p = p1 * p2;
45					int vco = floor(ref * m / (n + 2));
46					int clock = floor(vco / p);
47
48					if (p < min_p || p > max_p)
49						continue;
50					if (m < 70 || m > 120)
51						continue;
52					if (m2 > m1)
53						continue; /* won't happen */
54					if (vco < min_vco || vco > max_vco)
55						continue;
56
57/*
58					printf("clock: %d (%d,%d), %d, "
59						"(%d,%d)\n",
60						floor(clock / 1000),
61						m1, m2, n, p1, p2);
62*/
63
64					clocks[p2i][clock_count[p2i]] = clock;
65					vcos[p2i][clock_count[p2i]] = vco;
66					clock_count[p2i]++;
67				}
68			}
69		}
70	}
71}
72
73bool sort_p2(poly a, poly b)
74{
75	return a > b;
76}
77
78int min_rate = 25000 * 1000;
79int max_rate = 200000 * 1000;
80
81real scale_x(real clock)
82{
83	int min_x = 75, max_x = width - 50;
84
85	real frac = (clock - min_rate) / (max_rate - min_rate);
86
87	return min_x + frac * (max_x - min_x);
88}
89
90for (p2i = 0; p2i < dim(p2vals); p2i++) {
91	int p2 = p2vals[p2i]; 
92	calc_p2(p2i);
93	real row_y1 = (p2i + 1) / (dim(p2vals) + 1) * height;
94	real row_y2 = p2i / (dim(p2vals) + 1) * height;
95
96	/*qsort(&p2vals[p2i], sort_p2);*/
97
98	switch (p2) {
99	case 5:
100		set_source_rgb(cr, 1,0,0);
101		break;
102	case 10:
103		set_source_rgb(cr, 0,1,0);
104		break;
105	case 7:
106		set_source_rgb(cr, 0,0,1);
107		break;
108	case 14:
109		set_source_rgb(cr, 0,0,0);
110		break;
111	}
112
113	/* draw the line for the clock */
114	for (int i = 0; i < clock_count[p2i]; i++) {
115		int clock = clocks[p2i][i];
116		real xpos;
117
118		if (clock < min_rate || clock > max_rate)
119			continue;
120
121		xpos = scale_x(clock);
122		move_to(cr, xpos, row_y1);
123		line_to(cr, xpos, row_y2);
124		stroke(cr);
125	}
126
127	set_source_rgb(cr, 1, 1, 1);
128	/* add a mark for the vco value of the clocks at each location */
129	for (int i = 0; i < clock_count[p2i]; i++) {
130		int clock = clocks[p2i][i];
131		int vco = vcos[p2i][i];
132		real mark_center;
133
134		if (clock < min_rate || clock > max_rate)
135			continue;
136
137		real xpos = scale_x(clock);
138		real vcofrac = (vco - min_vco) / (max_vco - min_vco);
139		real mark_height = (row_y1 + vcofrac * (row_y2 - row_y1));
140
141		move_to(cr, xpos, mark_height - 1);
142		line_to(cr, xpos, mark_height + 1);
143		stroke(cr);
144	}
145
146	set_source_rgb(cr, 0, 0, 0);
147	string p2label = sprintf("p2 = %d", p2);
148	move_to(cr, 5, (p2i + .5) / (dim(p2vals) + 1) * height + 4);
149	show_text(cr, p2label);
150}
151
152void label_clock(real clock) {
153	real center_x = scale_x(clock);
154	string label = sprintf("%d", floor((clock + 500) / 1000000));
155		text_extents_t e = text_extents(cr, label);
156	real left_x = center_x - e.x_advance / 2;
157	save(cr);
158	move_to(cr, left_x, height - 20);
159	show_text(cr, label);
160	restore(cr);
161}
162
163label_clock(min_rate);
164label_clock(max_rate);
165label_clock(140 * 1000 * 1000);
166label_clock(115 * 1000 * 1000);
167label_clock(100 * 1000 * 1000);
168label_clock(82 * 1000 * 1000);
169
170string xlabel = "Clock in Mhz";
171text_extents_t e = text_extents(cr, xlabel);
172move_to(cr, width / 2 - e.x_advance / 2, height - 5);
173show_text(cr, xlabel);
174sleep(10);
175