diff options
author | Clifford Wolf <clifford@clifford.at> | 2015-10-27 20:00:36 +0100 |
---|---|---|
committer | Clifford Wolf <clifford@clifford.at> | 2015-10-27 20:00:36 +0100 |
commit | 7ea81c43da97953de68f61fafb277e6f6a83e631 (patch) | |
tree | 4740f804f9a766fac98e6b7e36449f440b43bce9 | |
parent | 1a99f955077f461a609511a04d95acc317c001ec (diff) | |
download | icestorm-7ea81c43da97953de68f61fafb277e6f6a83e631.tar.gz icestorm-7ea81c43da97953de68f61fafb277e6f6a83e631.tar.bz2 icestorm-7ea81c43da97953de68f61fafb277e6f6a83e631.zip |
icetime progress
-rw-r--r-- | icetime/Makefile | 4 | ||||
-rw-r--r-- | icetime/icetime.cc | 50 | ||||
-rw-r--r-- | icetime/mktest.py | 2 | ||||
-rw-r--r-- | icetime/show.sh | 29 |
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 + |