3
library "examples/sort.5c";
6
int width = 1000, height = 200;
7
int min_vco = 1400000000;
8
int max_vco = 2800000000;
12
int max_clocks = 2000;
13
int[4][max_clocks] clocks;
14
int[4][max_clocks] vcos;
15
int[4] clock_count = {0...};
17
int[4] p2vals = {5,10,7,14};
19
cairo_t cr = Cairo::new(width, height);
26
clocks[p2i] = (int [max_clocks]){0...};
28
if (p2 == 7 || p2 == 14) {
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++) {
43
int m = 5 * (m1 + 2) + (m2 + 2);
45
int vco = floor(ref * m / (n + 2));
46
int clock = floor(vco / p);
48
if (p < min_p || p > max_p)
50
if (m < 70 || m > 120)
53
continue; /* won't happen */
54
if (vco < min_vco || vco > max_vco)
58
printf("clock: %d (%d,%d), %d, "
64
clocks[p2i][clock_count[p2i]] = clock;
65
vcos[p2i][clock_count[p2i]] = vco;
73
bool sort_p2(poly a, poly b)
78
int min_rate = 25000 * 1000;
79
int max_rate = 200000 * 1000;
81
real scale_x(real clock)
83
int min_x = 75, max_x = width - 50;
85
real frac = (clock - min_rate) / (max_rate - min_rate);
87
return min_x + frac * (max_x - min_x);
90
for (p2i = 0; p2i < dim(p2vals); p2i++) {
93
real row_y1 = (p2i + 1) / (dim(p2vals) + 1) * height;
94
real row_y2 = p2i / (dim(p2vals) + 1) * height;
96
/*qsort(&p2vals[p2i], sort_p2);*/
100
set_source_rgb(cr, 1,0,0);
103
set_source_rgb(cr, 0,1,0);
106
set_source_rgb(cr, 0,0,1);
109
set_source_rgb(cr, 0,0,0);
113
/* draw the line for the clock */
114
for (int i = 0; i < clock_count[p2i]; i++) {
115
int clock = clocks[p2i][i];
118
if (clock < min_rate || clock > max_rate)
121
xpos = scale_x(clock);
122
move_to(cr, xpos, row_y1);
123
line_to(cr, xpos, row_y2);
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];
134
if (clock < min_rate || clock > max_rate)
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));
141
move_to(cr, xpos, mark_height - 1);
142
line_to(cr, xpos, mark_height + 1);
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);
152
void 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;
158
move_to(cr, left_x, height - 20);
159
show_text(cr, label);
163
label_clock(min_rate);
164
label_clock(max_rate);
165
label_clock(140 * 1000 * 1000);
166
label_clock(115 * 1000 * 1000);
167
label_clock(100 * 1000 * 1000);
168
label_clock(82 * 1000 * 1000);
170
string xlabel = "Clock in Mhz";
171
text_extents_t e = text_extents(cr, xlabel);
172
move_to(cr, width / 2 - e.x_advance / 2, height - 5);
173
show_text(cr, xlabel);