summaryrefslogtreecommitdiff
path: root/src/scripts/clock-graph.5c
diff options
context:
space:
mode:
Diffstat (limited to 'src/scripts/clock-graph.5c')
-rw-r--r--src/scripts/clock-graph.5c148
1 files changed, 148 insertions, 0 deletions
diff --git a/src/scripts/clock-graph.5c b/src/scripts/clock-graph.5c
new file mode 100644
index 00000000..98500e1e
--- /dev/null
+++ b/src/scripts/clock-graph.5c
@@ -0,0 +1,148 @@
+autoload Cairo;
+import Cairo;
+library "examples/sort.5c";
+import Sort;
+
+int width = 1000, height = 200;
+
+int min = 0xffffffff;
+int max = 0;
+
+int max_clocks = 1000;
+int[4][max_clocks] clocks;
+int[4] clock_count = {0...};
+
+int[4] p2vals = {5,10,7,14};
+
+cairo_t cr = Cairo::new(width, height);
+
+void calc_p2(int p2i)
+{
+ int p2 = p2vals[p2i];
+ int min_p, max_p;
+
+ clocks[p2i] = (int [max_clocks]){0...};
+
+ if (p2 == 7 || p2 == 14) {
+ /* LVDS */
+ min_p = 7;
+ max_p = 98;
+ } else {
+ /* SDVO/DAC */
+ min_p = 5;
+ max_p = 80;
+ }
+
+ for (int m1 = 10; m1 <= 20; m1++) {
+ for (int m2 = 5; m2 <= 9; m2++) {
+ for (int n = 3; n <= 8; n++) {
+ for (int p1 = 1; p1 <= 8; p1++) {
+ int ref = 96000000;
+ int m = 5 * (m1 + 2) + (m2 + 2);
+ int p = p1 * p2;
+ int vco = floor(ref * m / (n + 2));
+ int clock = floor(vco / p);
+
+ if (p < min_p || p > max_p)
+ continue;
+ if (m < 70 || m > 120)
+ continue;
+ if (m2 > m1)
+ continue; /* won't happen */
+ if (vco < 1400000000 ||
+ vco > 2800000000)
+ continue;
+
+/*
+ printf("clock: %d (%d,%d), %d, "
+ "(%d,%d)\n",
+ floor(clock / 1000),
+ m1, m2, n, p1, p2);
+*/
+
+ clocks[p2i][clock_count[p2i]] = clock;
+ clock_count[p2i]++;
+ }
+ }
+ }
+ }
+}
+
+bool sort_p2(poly a, poly b)
+{
+ return a > b;
+}
+
+int min_rate = 25000 * 1000;
+int max_rate = 200000 * 1000;
+
+real scale_x(real clock)
+{
+ int min_x = 75, max_x = width - 50;
+
+ real frac = (clock - min_rate) / (max_rate - min_rate);
+
+ return min_x + frac * (max_x - min_x);
+}
+
+for (p2i = 0; p2i < dim(p2vals); p2i++) {
+ int p2 = p2vals[p2i];
+ calc_p2(p2i);
+ /*qsort(&p2vals[p2i], sort_p2);*/
+
+ switch (p2) {
+ case 5:
+ set_source_rgb(cr, 1,0,0);
+ break;
+ case 10:
+ set_source_rgb(cr, 0,1,0);
+ break;
+ case 7:
+ set_source_rgb(cr, 0,0,1);
+ break;
+ case 14:
+ set_source_rgb(cr, 0,0,0);
+ break;
+ }
+ for (int i = 0; i < clock_count[p2i]; i++) {
+ int clock = clocks[p2i][i];
+ real xpos;
+
+ if (clock < min_rate || clock > max_rate)
+ continue;
+
+ xpos = scale_x(clock);
+ move_to(cr, xpos, p2i / (dim(p2vals) + 1) * height);
+ line_to(cr, xpos, (p2i + 1) / (dim(p2vals) + 1) * height);
+ stroke(cr);
+ }
+
+ set_source_rgb(cr, 0, 0, 0);
+ string p2label = sprintf("p2 = %d", p2);
+ move_to(cr, 5, (p2i + .5) / (dim(p2vals) + 1) * height + 4);
+ show_text(cr, p2label);
+}
+
+void label_clock(real clock) {
+ real center_x = scale_x(clock);
+ string label = sprintf("%d", floor((clock + 500) / 1000000));
+ text_extents_t e = text_extents(cr, label);
+ real left_x = center_x - e.x_advance / 2;
+ save(cr);
+ move_to(cr, left_x, height - 20);
+ show_text(cr, label);
+ restore(cr);
+}
+
+label_clock(min_rate);
+label_clock(max_rate);
+label_clock(140 * 1000 * 1000);
+label_clock(115 * 1000 * 1000);
+label_clock(100 * 1000 * 1000);
+label_clock(82 * 1000 * 1000);
+
+string xlabel = "Clock in Mhz";
+text_extents_t e = text_extents(cr, xlabel);
+move_to(cr, width / 2 - e.x_advance / 2, height - 5);
+show_text(cr, xlabel);
+sleep(10);