aboutsummaryrefslogtreecommitdiffstats
path: root/icetime
diff options
context:
space:
mode:
authorClifford Wolf <clifford@clifford.at>2015-10-27 20:00:36 +0100
committerClifford Wolf <clifford@clifford.at>2015-10-27 20:00:36 +0100
commit7ea81c43da97953de68f61fafb277e6f6a83e631 (patch)
tree4740f804f9a766fac98e6b7e36449f440b43bce9 /icetime
parent1a99f955077f461a609511a04d95acc317c001ec (diff)
downloadicestorm-7ea81c43da97953de68f61fafb277e6f6a83e631.tar.gz
icestorm-7ea81c43da97953de68f61fafb277e6f6a83e631.tar.bz2
icestorm-7ea81c43da97953de68f61fafb277e6f6a83e631.zip
icetime progress
Diffstat (limited to 'icetime')
-rw-r--r--icetime/Makefile4
-rw-r--r--icetime/icetime.cc50
-rw-r--r--icetime/mktest.py2
-rw-r--r--icetime/show.sh29
4 files changed, 62 insertions, 23 deletions
diff --git a/icetime/Makefile b/icetime/Makefile
index 7c170d9..f35dd8e 100644
--- a/icetime/Makefile
+++ b/icetime/Makefile
@@ -28,8 +28,8 @@ run0 run1 run2 run3 run4 run5 run6 run7 run8 run9: icetime
./icetime -P tq144 -p $(subst run,test,$@).pcf $(subst run,test,$@).txt $(subst run,test,$@)_out.v
show0 show1 show2 show3 show4 show5 show6 show7 show8 show9:
- # yosys -p 'equiv_mark; opt_clean -purge; show -color orange a:equiv_region!=0' $(subst show,test,$@).il
- yosys -p 'equiv_purge; opt_clean -purge; show' $(subst show,test,$@).il
+ bash show.sh $(subst show,test,$@)
+ xdot $(subst show,test,$@).dot
test: test0 test1 test2 test3 test4 test5 test6 test7 test8 test9
diff --git a/icetime/icetime.cc b/icetime/icetime.cc
index 86293d2..a0f356e 100644
--- a/icetime/icetime.cc
+++ b/icetime/icetime.cc
@@ -12,7 +12,7 @@
#include <map>
#include <set>
-#define ZSPAN_HACK 1
+#define ZSPAN_HACK 0
FILE *fin, *fout;
@@ -58,8 +58,7 @@ std::map<std::tuple<int, int, std::string>, int> x_y_name_net;
std::map<std::tuple<int, int, int>, net_segment_t> x_y_net_segment;
std::map<int, std::set<int>> net_buffers, net_rbuffers, net_routing;
std::map<std::pair<int, int>, std::pair<int, int>> connection_pos;
-std::set<int> used_nets;
-int graph_net = -1;
+std::set<int> used_nets, graph_nets;
std::set<net_segment_t> interconn_src, interconn_dst;
std::set<int> no_interconn_net;
@@ -1045,16 +1044,8 @@ struct make_interconn_worker_t
}
}
- void show_seg_tree(const net_segment_t &src)
+ void show_seg_tree(const net_segment_t &src, FILE *f)
{
- FILE *f = fopen("icetime_graph.dot", "w");
- if (f == nullptr) {
- perror("Can't open 'icetime_graph.dot' for writing");
- exit(1);
- }
-
- fprintf(f, "digraph \"icetime graph for net %d\" {\n", graph_net);
- fprintf(f, " rankdir = \"LR\";\n");
fprintf(f, " subgraph cluster_net_%d {\n", src.net);
fprintf(f, " label = \"net %d\";\n", src.net);
@@ -1064,13 +1055,10 @@ struct make_interconn_worker_t
for (auto &line : global_lines)
fprintf(f, "%s", line.c_str());
-
- fprintf(f, "}\n");
- fclose(f);
}
};
-void make_interconn(const net_segment_t &src)
+void make_interconn(const net_segment_t &src, FILE *graph_f)
{
make_interconn_worker_t worker;
worker.build_net_tree(src.net);
@@ -1103,8 +1091,11 @@ void make_interconn(const net_segment_t &src)
worker.create_cells(seg);
}
- if (worker.net_tree.count(graph_net))
- worker.show_seg_tree(src);
+ for (int n : graph_nets)
+ if (worker.net_tree.count(n)) {
+ worker.show_seg_tree(src, graph_f);
+ break;
+ }
}
void help(const char *cmd)
@@ -1138,7 +1129,7 @@ int main(int argc, char **argv)
selected_package = optarg;
break;
case 'g':
- graph_net = atoi(optarg);
+ graph_nets.insert(atoi(optarg));
break;
default:
help(argv[0]);
@@ -1177,8 +1168,27 @@ int main(int argc, char **argv)
for (auto &seg : net_to_segments[net])
make_seg_cell(net, seg);
+ FILE *graph_f = nullptr;
+
+ if (!graph_nets.empty())
+ {
+ graph_f = fopen("icetime_graph.dot", "w");
+ if (graph_f == nullptr) {
+ perror("Can't open 'icetime_graph.dot' for writing");
+ exit(1);
+ }
+
+ fprintf(graph_f, "digraph \"icetime net-segment graph \" {\n");
+ fprintf(graph_f, " rankdir = \"LR\";\n");
+ }
+
for (auto &seg : interconn_src)
- make_interconn(seg);
+ make_interconn(seg, graph_f);
+
+ if (graph_f) {
+ fprintf(graph_f, "}\n");
+ fclose(graph_f);
+ }
fprintf(fout, "module chip (");
const char *io_sep = "";
diff --git a/icetime/mktest.py b/icetime/mktest.py
index b7f4b2e..c6c4c32 100644
--- a/icetime/mktest.py
+++ b/icetime/mktest.py
@@ -55,7 +55,7 @@ os.rename("%s.v" % sys.argv[1], "%s_in.v" % sys.argv[1])
with open("%s_ref.v" % sys.argv[1], "w") as f:
for line in open("%s.vsb" % sys.argv[1], "r"):
- zspan_hack = True
+ zspan_hack = False
line = line.replace(" Span4Mux_s0_h ", " Span4Mux_h0 " if zspan_hack else " Span4Mux_h0 ")
line = line.replace(" Span4Mux_s1_h ", " Span4Mux_h0 " if zspan_hack else " Span4Mux_h1 ")
diff --git a/icetime/show.sh b/icetime/show.sh
new file mode 100644
index 0000000..ee3e7bd
--- /dev/null
+++ b/icetime/show.sh
@@ -0,0 +1,29 @@
+#!/bin/bash
+
+set -ex
+
+yosys -p '
+ cd equiv
+ equiv_mark
+ select -write equiv_graph.segs w:seg_*_gate a:equiv_region!=0 %i
+ show -prefix equiv_graph -format dot a:equiv_region!=0 %co2 a:equiv_region!=0 %ci2
+' $1.il
+
+./icetime -P tq144 -p $1.pcf $1.txt $( sed 's,_gate$,,; s,.*_,-g ,;' < equiv_graph.segs ) > /dev/null
+
+{
+ egrep -v '^}' icetime_graph.dot
+ egrep -v '^(digraph|label=|})' equiv_graph.dot
+
+ for seg in $( sed 's,equiv/,,' equiv_graph.segs ); do
+ n=$( awk "/$seg/ { print \$1; }" equiv_graph.dot )
+ s=$( echo $seg | sed 's,_[0-9]*_gate$,,' )
+ echo " $n:s -> $s:n [style=bold];"
+ done
+ echo "}"
+} > $1.dot
+
+rm -f equiv_graph.segs
+rm -f equiv_graph.dot
+rm -f icetime_graph.dot
+