PIPS
phrase_tools.c
Go to the documentation of this file.
1 /*
2 
3  $Id: phrase_tools.c 23495 2018-10-24 09:19:47Z coelho $
4 
5  Copyright 1989-2016 MINES ParisTech
6 
7  This file is part of PIPS.
8 
9  PIPS is free software: you can redistribute it and/or modify it
10  under the terms of the GNU General Public License as published by
11  the Free Software Foundation, either version 3 of the License, or
12  any later version.
13 
14  PIPS is distributed in the hope that it will be useful, but WITHOUT ANY
15  WARRANTY; without even the implied warranty of MERCHANTABILITY or
16  FITNESS FOR A PARTICULAR PURPOSE.
17 
18  See the GNU General Public License for more details.
19 
20  You should have received a copy of the GNU General Public License
21  along with PIPS. If not, see <http://www.gnu.org/licenses/>.
22 
23 */
24 #ifdef HAVE_CONFIG_H
25  #include "pips_config.h"
26 #endif
27 /*
28  *
29  * This phase is used for PHRASE project.
30  *
31  * NB: The PHRASE project is an attempt to automatically (or
32  * semi-automatically) transform high-level language for partial
33  * evaluation in reconfigurable logic (such as FPGAs or DataPaths).
34 
35  * This file provides tools used in this library.
36  *
37 */
38 
39 #include <stdio.h>
40 #include <ctype.h>
41 
42 #include "genC.h"
43 #include "linear.h"
44 #include "ri.h"
45 #include "effects.h"
46 
47 #include "resources.h"
48 
49 #include "misc.h"
50 #include "ri-util.h"
51 #include "prettyprint.h"
52 #include "effects-util.h"
53 
54 #include "text-util.h"
55 
56 #include "dg.h"
57 
58 
59 #include "phrase_tools.h"
60 
61 /**
62  * DEBUG FUNCTION: return a string representing the type of the
63  * statement (SEQUENCE, CALL, etc...)
64  */
66 {
68  switch (instruction_tag(i)) {
69  case is_instruction_test: {
70  return strdup("TEST");
71  break;
72  }
74  return strdup("SEQUENCE");
75  break;
76  }
77  case is_instruction_loop: {
78  return strdup("LOOP");
79  break;
80  }
82  return strdup("WHILELOOP");
83  break;
84  }
86  return strdup("FORLOOP");
87  break;
88  }
89  case is_instruction_call: {
90  return strdup("CALL");
91  break;
92  }
94  return strdup("UNSTRUCTURED");
95  break;
96  }
97  case is_instruction_goto: {
98  return strdup("GOTO");
99  break;
100  }
101  default:
102  return strdup("UNDEFINED");
103  break;
104  }
105 }
106 
107 /**
108  * DEBUG FUNCTION: print debugging informations for
109  * a statement stat
110  */
111 void debug_statement (const char* comments, statement stat, int debug_level)
112 {
114  pips_debug(debug_level,"%s\n",comments);
115  print_statement(stat);
116  pips_debug(debug_level,"domain number = %"PRIdPTR"\n", statement_domain_number(stat));
117  pips_debug(debug_level,"entity = UNDEFINED\n");
118  pips_debug(debug_level,"statement number = %"PRIdPTR"\n", statement_number(stat));
119  pips_debug(debug_level,"statement ordering = %"PRIdPTR"\n", statement_ordering(stat));
120  if (statement_with_empty_comment_p(stat)) {
121  pips_debug(debug_level,"statement comments = EMPTY\n");
122  }
123  else {
124  pips_debug(debug_level,"statement comments = %s\n", statement_comments(stat));
125  }
126  pips_debug(debug_level,"statement instruction = %s\n", statement_type_as_string(stat));
127  }
128 }
129 
130 /**
131  * DEBUG FUNCTION: print debugging informations for
132  * a control a_control
133  */
134 void debug_control (const char* comments, control a_control, int debug_level) {
135 
136  debug_statement (comments, control_statement(a_control), debug_level);
137  pips_debug(debug_level," predecessors = %zd\n", gen_length(control_predecessors(a_control)));
138  pips_debug(debug_level," successors = %zd\n", gen_length(control_successors(a_control)));
139 
140 }
141 
142 /**
143  * DEBUG FUNCTION: print debugging informations for
144  * an unstructured an_unstructured
145  */
146 void debug_unstructured (unstructured an_unstructured,
147  int debug_level)
148 {
149  list blocs = NIL ;
150  string line = "***********************************************************************\n";
151 
152  ifdebug (debug_level) {
153  CONTROL_MAP (current_control, {
154  statement s = control_statement (current_control);
155  string next_nodes_as_string = "";
156  string previous_nodes_as_string = "";
157  char *title;
158  list predecessors = control_predecessors(current_control);
159  list successors = control_successors(current_control);
160  char *temp;
161  size_t i;
162  int ordering = 0;
163 
164  for (i=0; i<gen_length(predecessors); i++) {
167  ordering = beautify_ordering (ordering);
168  /*if (ordering > 65535) ordering = ordering >> 16;*/
169  asprintf (&temp, "[%d] ",ordering);
170  previous_nodes_as_string = strdup (concatenate(previous_nodes_as_string,
171  temp,
172  NULL));
173  free(temp);
174  }
175 
176  for (i=0; i<gen_length(successors); i++) {
178  (CONTROL(gen_nth(i,successors))));
179  ordering = beautify_ordering (ordering);
180  /*if (ordering > 65535) ordering = ordering >> 16;*/
181  asprintf (&temp, "[%d] ",ordering);
182  next_nodes_as_string = strdup (concatenate(next_nodes_as_string,
183  (temp),
184  NULL));
185  free(temp);
186  }
187 
188  ordering = beautify_ordering (ordering);
189  ordering = statement_ordering(s);
190  /*if (ordering > 65535) ordering = ordering >> 16;*/
192  asprintf (&title, "CONTROL: %d\n", ordering);
193  pips_debug(debug_level, "%s\n",
194  strdup(concatenate("\n", line,
195  "* ", (title),
196  line, NULL)));
197  print_statement(s);
198  pips_debug(debug_level, "%s\n",
199  strdup(concatenate("\n", line,
200  "NEXT: ", next_nodes_as_string, "\n",
201  "PREVIOUS: ", previous_nodes_as_string, "\n",
202  line, NULL)));
203  free(title);
204  }
205  }, unstructured_entry(an_unstructured), blocs);
206  }
207 }
208 
209 /**
210  * DEBUG FUNCTION: print debugging informations for
211  * an unstructured an_unstructured (short version)
212  */
214  int debug_level)
215 {
216  ifdebug (debug_level) {
217 
218  list blocs = NIL;
219  string entry_as_string, exit_as_string, temp;
220  asprintf (&temp, "[%p] ",unstructured_entry(an_unstructured));
221  entry_as_string = strdup(temp);
222  asprintf (&temp, "[%p] ",unstructured_exit(an_unstructured));
223  exit_as_string = strdup(temp);
224  pips_debug(debug_level, "%s\n",
225  strdup(concatenate("UNSTRUCTURED\n",
226  "ENTRY: ", entry_as_string, "\n",
227  "PREVIOUS: ", exit_as_string, "\n",
228  NULL)));
229 
230  CONTROL_MAP (current_control, {
231  string next_nodes_as_string = "";
232  string previous_nodes_as_string = "";
233  char *title;
234 
235  MAP(CONTROL, c, {
236  asprintf (&temp, "[%p] ",c);
237  previous_nodes_as_string = strdup (concatenate(previous_nodes_as_string,
238  (temp),
239  NULL));
240  free(temp);
241  }, control_predecessors(current_control));
242 
243  MAP(CONTROL, c, {
244  asprintf (&temp, "[%p] ",c);
245  next_nodes_as_string = strdup (concatenate(next_nodes_as_string,
246  (temp),
247  NULL));
248  free(temp);
249  }, control_successors(current_control));
250 
251  asprintf (&title, "CONTROL: %p\n", current_control);
252  pips_debug(debug_level, "%s\n",
253  strdup(concatenate(title,
254  "NEXT: ", next_nodes_as_string, "\n",
255  "PREVIOUS: ", previous_nodes_as_string, "\n",
256  NULL)));
257  free(title);
258  }, unstructured_entry(an_unstructured), blocs);
259  }
260 }
261 
262 
263 /**
264  * This function build and return new variable from
265  * a variable a_variable, with name new_name. If an entity
266  * called new_name already exists, return NULL.
267  * New variable is added to declarations
268  */
270  const char* new_name,
271  const char* module_name)
272 {
273  entity module;
275 
277  /* Assert that module represent a value code */
278  pips_assert("it is a code", value_code_p(entity_initial(module)));
279 
282  new_name,
283  NULL),
285  {
286  /* This entity does not exist, we can safely create it */
287 
288  /* new_variable = copy_entity (a_variable);
289  entity_name(new_variable)
290  = strdup(concatenate(module_name,
291  MODULE_SEP_STRING,
292  new_name, NULL)); */
293 
296  new_name, NULL)),
300 
301  /*new_variable
302  = find_or_create_scalar_entity (strdup(concatenate(module_name,
303  MODULE_SEP_STRING,
304  new_name, NULL)),module_name,
305  is_basic_int);*/
306 
308  return new_variable;
309  }
310  else
311  {
312  /* This entity already exist, we return null */
313  return NULL;
314  }
315 }
316 
317 /**
318  * Build and return new entity obtained by cloning variable
319  * cloned_variable, with a name obtained by the concatenation
320  * of base_name and the statement ordering of statement stat.
321  * If such entity already exist, increment statement ordering
322  * to get first free name. We assume then that created entity's
323  * name is unique.
324  */
326  const char* base_name,
327  statement stat,
328  const char* module_name)
329 {
330  string variable_name;
331  entity returned_variable = NULL;
332  int index = statement_ordering(stat);
333  //char *buffer;
334 
335  while (returned_variable == NULL) {
336 
337  asprintf(&variable_name, base_name, index++);
338  returned_variable
339  = clone_variable_with_new_name (cloned_variable,
341  module_name);
342  }
343 
344  return returned_variable;
345 
346 }
347 
348 /**
349  * Build and return new statement which is a binary call with
350  * the 2 expressions expression1 and expression2, with empty
351  * label, statement number and ordering of statement stat,
352  * and empty comments
353  */
354 statement make_binary_call_statement (const char* operator_name,
355  expression expression1,
356  expression expression2,
357  statement stat)
358 {
359  call assignment_call
360  = make_call (entity_intrinsic(operator_name),
362  expression1,
363  CONS(EXPRESSION, expression2, NIL)));
364 
365  if (stat == NULL) {
371  assignment_call),
372  NIL,NULL,
374  }
375  else {
377  statement_number(stat),
378  statement_ordering(stat),
381  assignment_call),
382  NIL,NULL,
384  }
385 }
386 
387 /**
388  * Build and return new statement which is a assignement of variable
389  * a_variable with expression an_expression, with empty label, statement
390  * number and ordering of statement stat, and empty comments
391  */
393  expression an_expression,
394  statement stat)
395 {
398  an_expression,
399  stat);
400 }
401 
402 
403 /**
404  * Special function made for Ronan Keryell who likes a lot
405  * when a integer number is coded on 3 bits :-)
406  */
407 int beautify_ordering (int an_ordering)
408 {
409  int ordering_up = (an_ordering & 0xffff0000) >> 16;
410  int ordering_down = (an_ordering & 0x0000ffff);
411  return ordering_up + ((ordering_down-1) << 16);
412 }
413 
414 void clean_statement_from_tags (const char* comment_portion,
415  statement stat)
416 {
417  string comments;
418  char* next_line;
419  string searched_string;
420 
421  if (!statement_with_empty_comment_p(stat)) {
422 
423  string new_comments = NULL;
424 
425  searched_string = strdup(comment_portion);
426  searched_string[strcspn(comment_portion, "%s")] = '\0';
427  comments = strdup(statement_comments(stat));
428  next_line = strtok (comments, "\n");
429  if (next_line != NULL) {
430  do {
431  if (strstr(next_line,searched_string) == NULL) {
432  if (new_comments != NULL) {
433  new_comments = strdup(concatenate(new_comments, next_line, "\n", NULL));
434  }
435  else {
436  new_comments = strdup(concatenate("", next_line, "\n", NULL));
437  }
438  }
439  next_line = strtok(NULL, "\n");
440  }
441  while (next_line != NULL);
442  }
443 
444  if (new_comments != NULL) {
445  statement_comments(stat) = new_comments;
446  }
447  else {
449  }
450  }
451 
452 }
453 
454 typedef struct {
458 
459 static void check_if_statement_contains_comment(statement s, void* a_context)
460 {
462  string comments;
463 
465 
466  comments = strdup(statement_comments(s));
467 
468  /*pips_debug(5, "Searching comment: [%s] in [%s]\n",
469  context->searched_string, comments);*/
470 
471  if (strstr(comments,context->searched_string) != NULL) {
472  context->list_of_statements
473  = CONS(STATEMENT,s,context->list_of_statements);
474  }
475  }
476 }
477 
478 /**
479  *
480  */
481 list get_statements_with_comments_containing (const char* comment_portion,
482  statement stat)
483 {
485 
486  /* First, set searched_string (we remove format information)*/
487  context.searched_string = strdup(comment_portion);
488  context.searched_string[strcspn(comment_portion, "%s")] = '\0';
489 
490  /* Reset list */
491  context.list_of_statements = NIL;
492 
493  /*ifdebug(5) {
494  pips_debug(5, "Searching statements with comments: %s\n",
495  context.searched_string);
496  pips_debug(5, "In statement:\n");
497  print_statement(stat);
498  }*/
499 
502 
503  return context.list_of_statements;
504 
505 }
506 
508  statement searched_stat)
509 {
510  return (sequence_statement_containing (root_statement,
511  searched_stat) != NULL);
512 }
513 
514 typedef struct {
518 
519 
521  void* a_context)
522 {
524  = (sequence_searching_context*)a_context;
526 
528  MAP (STATEMENT, s2, {
529  if (s2 == context->searched_statement) {
530  context->found_sequence_statement = s;
531  }
533  }
534 }
535 
537  statement searched_stat)
538 {
540 
541  context.searched_statement = searched_stat;
542  context.found_sequence_statement = NULL;
543 
544  gen_context_recurse(root_statement, &context,
546 
547  return context.found_sequence_statement;
548 }
549 
550 /**
551  * Replace statement old_stat by statement new_stat, asserting that this
552  * statement is contained in a sequence
553  */
555  statement new_stat,
556  statement root_stat)
557 {
558  statement sequence_statement = sequence_statement_containing (root_stat,
559  old_stat);
560  list stats_list;
561  list new_stats_list = NIL;
562 
563  pips_debug(5, "BEGIN replace_in_sequence_statement_with:\n");
564 
565  pips_assert("Statement is contained in a sequence",
566  sequence_statement != NULL);
567 
568  stats_list = sequence_statements(instruction_sequence(statement_instruction(sequence_statement)));
569 
570  MAP (STATEMENT, s, {
571  ifdebug(7) {
572  pips_debug(7, "Iterate on statement:\n");
573  print_statement(s);
574  }
575  if (s == old_stat) {
576  pips_debug(7, "Replace this statement:\n");
577  new_stats_list = CONS(STATEMENT,new_stat,new_stats_list);
578  }
579  else {
580  pips_debug(7, "Keep this statement:\n");
581  new_stats_list = CONS(STATEMENT,s,new_stats_list);
582  }
583  }, stats_list);
584 
585  sequence_statements(instruction_sequence(statement_instruction(sequence_statement))) = gen_nreverse(new_stats_list);
586 
587  /*gen_insert_after (new_stat, old_stat, stats_list);
588  gen_remove (&stats_list, old_stat);*/
589 
590  ifdebug(7) {
591  pips_debug(7, "I've got this for the sequence\n");
592  print_statement(sequence_statement);
593  pips_debug(7, "I've got this for the root statement\n");
594  print_statement(root_stat);
595  }
596 
597  pips_debug(5, "END replace_in_sequence_statement_with:\n");
598 }
599 
600 /**
601  * Return a list of references corresponding to a list of regions
602  */
604 {
605  list l_ref = NIL;
606 
607  MAP (EFFECT, reg, {
609  l_ref = CONS (REFERENCE, ref, l_ref);
611  pips_debug(4,"Entity: %s\n", entity_local_name(reference_variable(ref)));
612  },l_regions);
613 
614  return l_ref;
615 }
616 
617 
call make_call(entity a1, list a2)
Definition: ri.c:269
type copy_type(type p)
TYPE.
Definition: ri.c:2655
statement make_statement(entity a1, intptr_t a2, intptr_t a3, string a4, instruction a5, list a6, string a7, extensions a8, synchronization a9)
Definition: ri.c:2222
value copy_value(value p)
VALUE.
Definition: ri.c:2784
storage copy_storage(storage p)
STORAGE.
Definition: ri.c:2228
instruction make_instruction(enum instruction_utype tag, void *val)
Definition: ri.c:1166
synchronization make_synchronization_none(void)
Definition: ri.c:2424
static reference ref
Current stmt (an integer)
Definition: adg_read_paf.c:163
static list predecessors(statement st, graph tg)
static list successors(list l)
static entity new_variable
entity to be replaced, the primary?
Definition: dynamic.c:860
#define effect_any_reference(e)
FI: cannot be used as a left hand side.
#define EFFECT(x)
EFFECT.
Definition: effects.h:608
const char * module_name(const char *s)
Return the module part of an entity name.
Definition: entity_names.c:296
static entity a_variable
#define gen_context_recurse(start, ctxt, domain_number, flt, rwt)
Definition: genC.h:285
void free(void *)
#define CONTROL_MAP(ctl, code, c, list)
Macro to walk through all the controls reachable from a given control node of an unstructured.
bool gen_true2(__attribute__((unused)) gen_chunk *u1, __attribute__((unused)) void *u2)
Definition: genClib.c:2785
list gen_nreverse(list cp)
reverse a list in place
Definition: list.c:304
#define NIL
The empty list (nil in Lisp)
Definition: newgen_list.h:47
size_t gen_length(const list l)
Definition: list.c:150
#define CONS(_t_, _i_, _l_)
List element cell constructor (insert an element at the beginning of a list)
Definition: newgen_list.h:150
gen_chunk gen_nth(int n, const list l)
to be used as ENTITY(gen_nth(3, l))...
Definition: list.c:710
#define MAP(_map_CASTER, _map_item, _map_code, _map_list)
Apply/map an instruction block on all the elements of a list (old fashioned)
Definition: newgen_list.h:226
bool statement_with_empty_comment_p(statement)
Return true if the statement has an empty statement:
Definition: statement.c:126
#define pips_debug
these macros use the GNU extensions that allow variadic macros, including with an empty list.
Definition: misc-local.h:145
#define asprintf
Definition: misc-local.h:225
#define pips_assert(what, predicate)
common macros, two flavors depending on NDEBUG
Definition: misc-local.h:172
#define MODULE_SEP_STRING
Definition: naming-local.h:30
#define STATEMENT_ORDERING_UNDEFINED
mapping.h inclusion
Definition: newgen-local.h:35
string concatenate(const char *,...)
Return the concatenation of the given strings.
Definition: string.c:183
void * gen_find_tabulated(const char *, int)
Definition: tabulated.c:218
entity make_variable_from_name_and_entity(entity cloned_variable, const char *base_name, statement stat, const char *module_name)
Build and return new entity obtained by cloning variable cloned_variable, with a name obtained by the...
Definition: phrase_tools.c:325
static void check_if_statement_contains_comment(statement s, void *a_context)
Definition: phrase_tools.c:459
list get_statements_with_comments_containing(const char *comment_portion, statement stat)
Definition: phrase_tools.c:481
void debug_unstructured(unstructured an_unstructured, int debug_level)
DEBUG FUNCTION: print debugging informations for an unstructured an_unstructured.
Definition: phrase_tools.c:146
list references_for_regions(list l_regions)
Return a list of references corresponding to a list of regions.
Definition: phrase_tools.c:603
string statement_type_as_string(statement stat)
DEBUG FUNCTION: return a string representing the type of the statement (SEQUENCE, CALL,...
Definition: phrase_tools.c:65
entity clone_variable_with_new_name(entity a_variable, const char *new_name, const char *module_name)
This function build and return new variable from a variable a_variable, with name new_name.
Definition: phrase_tools.c:269
void debug_control(const char *comments, control a_control, int debug_level)
DEBUG FUNCTION: print debugging informations for a control a_control.
Definition: phrase_tools.c:134
statement make_assignement_statement(entity a_variable, expression an_expression, statement stat)
Build and return new statement which is a assignement of variable a_variable with expression an_expre...
Definition: phrase_tools.c:392
void debug_statement(const char *comments, statement stat, int debug_level)
DEBUG FUNCTION: print debugging informations for a statement stat.
Definition: phrase_tools.c:111
void clean_statement_from_tags(const char *comment_portion, statement stat)
Definition: phrase_tools.c:414
int beautify_ordering(int an_ordering)
Special function made for Ronan Keryell who likes a lot when a integer number is coded on 3 bits :-)
Definition: phrase_tools.c:407
void short_debug_unstructured(unstructured an_unstructured, int debug_level)
DEBUG FUNCTION: print debugging informations for an unstructured an_unstructured (short version)
Definition: phrase_tools.c:213
statement make_binary_call_statement(const char *operator_name, expression expression1, expression expression2, statement stat)
Build and return new statement which is a binary call with the 2 expressions expression1 and expressi...
Definition: phrase_tools.c:354
static void search_sequence_containing(statement s, void *a_context)
Definition: phrase_tools.c:520
bool statement_is_contained_in_a_sequence_p(statement root_statement, statement searched_stat)
Definition: phrase_tools.c:507
statement sequence_statement_containing(statement root_statement, statement searched_stat)
Definition: phrase_tools.c:536
void replace_in_sequence_statement_with(statement old_stat, statement new_stat, statement root_stat)
Replace statement old_stat by statement new_stat, asserting that this statement is contained in a seq...
Definition: phrase_tools.c:554
static char * module
Definition: pips.c:74
void print_reference(reference r)
Definition: expression.c:142
void print_statement(statement)
Print a statement on stderr.
Definition: statement.c:98
#define make_entity(n, t, s, i)
#define STATEMENT_NUMBER_UNDEFINED
default values
#define empty_comments
Empty comments (i.e.
#define ASSIGN_OPERATOR_NAME
Definition: ri-util-local.h:95
const char * entity_local_name(entity e)
entity_local_name modified so that it does not core when used in vect_fprint, since someone thought t...
Definition: entity.c:453
entity module_name_to_entity(const char *mn)
This is an alias for local_name_to_top_level_entity.
Definition: entity.c:1479
entity entity_empty_label(void)
Definition: entity.c:1105
entity entity_intrinsic(const char *name)
FI: I do not understand this function name (see next one!).
Definition: entity.c:1292
expression entity_to_expression(entity e)
if v is a constant, returns a constant call.
Definition: expression.c:165
extensions empty_extensions(void)
extension.c
Definition: extension.c:43
void AddEntityToDeclarations(entity, entity)
END_EOLE.
Definition: variable.c:108
#define value_code_p(x)
Definition: ri.h:3065
#define REFERENCE(x)
REFERENCE.
Definition: ri.h:2296
#define reference_variable(x)
Definition: ri.h:2326
#define control_predecessors(x)
Definition: ri.h:943
#define statement_ordering(x)
Definition: ri.h:2454
#define entity_storage(x)
Definition: ri.h:2794
#define statement_domain
newgen_sizeofexpression_domain_defined
Definition: ri.h:362
#define CONTROL(x)
CONTROL.
Definition: ri.h:910
#define EXPRESSION(x)
EXPRESSION.
Definition: ri.h:1217
#define entity_undefined
Definition: ri.h:2761
@ is_instruction_goto
Definition: ri.h:1473
@ is_instruction_unstructured
Definition: ri.h:1475
@ is_instruction_whileloop
Definition: ri.h:1472
@ is_instruction_test
Definition: ri.h:1470
@ is_instruction_call
Definition: ri.h:1474
@ is_instruction_sequence
Definition: ri.h:1469
@ is_instruction_forloop
Definition: ri.h:1477
@ is_instruction_loop
Definition: ri.h:1471
#define instruction_tag(x)
Definition: ri.h:1511
#define statement_domain_number(x)
Definition: ri.h:2448
#define sequence_statements(x)
Definition: ri.h:2360
#define statement_extensions(x)
Definition: ri.h:2464
#define instruction_sequence(x)
Definition: ri.h:1514
#define control_successors(x)
Definition: ri.h:945
#define unstructured_exit(x)
Definition: ri.h:3006
#define unstructured_entry(x)
Definition: ri.h:3004
#define statement_instruction(x)
Definition: ri.h:2458
#define statement_comments(x)
Definition: ri.h:2456
#define control_statement(x)
Definition: ri.h:941
#define entity_type(x)
Definition: ri.h:2792
#define statement_number(x)
Definition: ri.h:2452
#define entity_domain
newgen_syntax_domain_defined
Definition: ri.h:410
#define STATEMENT(x)
STATEMENT.
Definition: ri.h:2413
#define entity_initial(x)
Definition: ri.h:2796
char * strdup()
char * variable_name(Variable v)
polynome_ri.c
Definition: polynome_ri.c:73
static int line
FLEX_SCANNER.
Definition: scanner.c:852
#define ifdebug(n)
Definition: sg.c:47
The structure used to build lists in NewGen.
Definition: newgen_list.h:41
Definition: delay.c:253