icetime progress

This commit is contained in:
Clifford Wolf 2015-10-27 20:00:36 +01:00
parent 1a99f95507
commit 7ea81c43da
4 changed files with 62 additions and 23 deletions

View File

@ -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

View File

@ -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 = "";

View File

@ -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 ")

29
icetime/show.sh Normal file
View File

@ -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