added ump_new_pattern, finish_new_pattern
[libfirm] / ir / stat / pattern_dmp.c
1 /*
2  * Project:     libFIRM
3  * File name:   ir/ir/pattern_dmp.c
4  * Purpose:     Statistics for Firm.
5  * Author:      Michael Beck
6  * Created:
7  * CVS-ID:      $Id$
8  * Copyright:   (c) 2004 Universität Karlsruhe
9  * Licence:     This file protected by GPL -  GNU GENERAL PUBLIC LICENSE.
10  */
11
12 #ifdef HAVE_CONFIG_H
13 # include "config.h"
14 #endif
15
16 #include <stdio.h>
17
18 #include "ident.h"
19 #include "irop_t.h"
20 #include "irmode.h"
21 #include "pattern_dmp.h"
22
23 FILE *f;
24
25 /**
26  * starts a new VCG graph
27  */
28 static void vcg_dump_start(pattern_dumper_t *self)
29 {
30   f = fopen("firmpattern.vcg", "w");
31
32   fprintf(f,
33     "graph: { title: \"Most found pattern\"\n"
34     "  display_edge_labels: no\n"
35     "  layoutalgorithm: mindepth\n"
36     "  manhattan_edges: yes\n"
37     "  port_sharing: no\n"
38     "  orientation: bottom_to_top\n"
39   );
40 }
41
42 /**
43  * ends a new VCG graph
44  */
45 static void vcg_dump_end(pattern_dumper_t *self)
46 {
47   fprintf(f, "}\n");
48   fclose(f);
49 }
50
51 /*
52  * starts a new pattern
53  */
54 static void vcg_dump_new_pattern(pattern_dumper_t *self, counter_t *cnt)
55 {
56   fprintf(f,
57     "  graph: { title: \"pattern cnt %u\"\n", cnt->cnt[0]
58   );
59
60 }
61
62 /**
63  * Finishes current pattern
64  */
65 static void vcg_dump_finish_pattern(pattern_dumper_t *self)
66 {
67   fprintf(f, "  }\n");
68 }
69
70
71 static void vcg_dump_node(pattern_dumper_t *self, unsigned id,
72     unsigned op_code, unsigned mode_code)
73 {
74   ir_op *op     = (ir_op *)op_code;
75   ir_mode *mode = (ir_mode *)mode_code;
76
77   fprintf(f, "    node: {title: \"n%u\" label: \"%s%s n%u\" }\n",
78     id, get_id_str(op->name), mode ? get_mode_name(mode) : "", id);
79 }
80
81 static void vcg_dump_edge(pattern_dumper_t *self, unsigned id, unsigned parent, unsigned position)
82 {
83   fprintf(f, "    edge: { sourcename: \"n%u\" targetname: \"n%u\"}\n", parent, id);
84 }
85
86 /**
87  * The VCG dumper.
88  */
89 pattern_dumper_t vcg_dump = {
90   vcg_dump_new_pattern,
91   vcg_dump_finish_pattern,
92   vcg_dump_node,
93   NULL,
94   vcg_dump_edge,
95   NULL,
96   NULL,
97 };
98
99 /**
100  * starts a new pattern
101  */
102 static void stdout_dump_new_pattern(pattern_dumper_t *self, counter_t *cnt)
103 {
104   printf("%8u ", cnt->cnt[0]);
105 }
106
107
108 /*
109  * Finishes current pattern
110  */
111 static void stdout_dump_finish_pattern(pattern_dumper_t *self)
112 {
113   printf("\n");
114 }
115
116 /**
117  * Dumps a node
118  */
119 static void stdout_dump_node(pattern_dumper_t *self, unsigned id, unsigned op_code, unsigned mode_code)
120 {
121   ir_op *op     = (ir_op *)op_code;
122   ir_mode *mode = (ir_mode *)mode_code;
123
124   /* if (env->options & OPT_ENC_GRAPH) */
125     printf("%u:", id);
126
127   printf("%s", get_id_str(op->name));
128
129   if (mode)
130     printf("%s", get_mode_name(mode));
131 }
132
133 /**
134  * Dump a ref
135  */
136 static void stdout_dump_ref(pattern_dumper_t *self, unsigned id)
137 {
138   printf("REF:%u", id);
139 }
140
141 /**
142  * Dump an edge
143  */
144 static void stdout_dump_edge(pattern_dumper_t *self, unsigned id, unsigned parent, unsigned position)
145 {
146   if (position > 0)
147     printf(", ");
148 }
149
150 /**
151  * Start children dumper
152  */
153 static void stdout_start_children(pattern_dumper_t *self, unsigned id)
154 {
155   printf("(");
156 }
157
158 /**
159  * finishes childred  dumper
160  */
161 static void stdout_finish_children(pattern_dumper_t *self, unsigned id)
162 {
163   printf(")");
164 }
165
166 /**
167  * The stdout dumper.
168  */
169 pattern_dumper_t stdout_dump = {
170   stdout_dump_new_pattern,
171   stdout_dump_finish_pattern,
172   stdout_dump_node,
173   stdout_dump_ref,
174   stdout_dump_edge,
175   stdout_start_children,
176   stdout_finish_children,
177 };
178
179 /* ------------------------------------ API ------------------------------------- */
180
181 /*
182  * starts a new pattern
183  */
184 void pattern_dump_new_pattern(pattern_dumper_t *self, counter_t *cnt)
185 {
186   if (self->dump_new_pattern)
187     self->dump_new_pattern(self, cnt);
188 }
189
190
191 /*
192  * Finishes current pattern
193  */
194 void pattern_dump_finish_pattern(pattern_dumper_t *self)
195 {
196   if (self->dump_finish_pattern)
197     self->dump_finish_pattern(self);
198 }
199
200
201 /*
202  * Dumps a node
203  */
204 void pattern_dump_node(pattern_dumper_t *self, unsigned id, unsigned op_code, unsigned mode_code)
205 {
206   if (self->dump_node)
207     self->dump_node(self, id, op_code, mode_code);
208 }
209
210 /*
211  * Dump a ref
212  */
213 void pattern_dump_ref(pattern_dumper_t *self, unsigned id)
214 {
215   if (self->dump_ref)
216     self->dump_ref(self, id);
217 }
218
219 /*
220  * Dump an edge
221  */
222 void pattern_dump_edge(pattern_dumper_t *self, unsigned id, unsigned parent, unsigned position)
223 {
224   if (self->dump_edge)
225     self->dump_edge(self, id, parent, position);
226 }
227
228 /*
229  * Start children dumper
230  */
231 void pattern_start_children(pattern_dumper_t *self, unsigned id)
232 {
233   if (self->dump_start_children)
234     self->dump_start_children(self, id);
235 }
236
237 /*
238  * finishes childred dumper
239  */
240 void pattern_finish_children(pattern_dumper_t *self, unsigned id)
241 {
242   if (self->dump_finish_children)
243     self->dump_finish_children(self, id);
244 }