OpenCores
URL https://opencores.org/ocsvn/tcp_socket/tcp_socket/trunk

Subversion Repositories tcp_socket

[/] [tcp_socket/] [trunk/] [chips2/] [chips/] [compiler/] [parse_tree.py] - Blame information for rev 4

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 jondawson
__author__ = "Jon Dawson"
2
__copyright__ = "Copyright (C) 2012, Jonathan P Dawson"
3
__version__ = "0.1"
4
 
5 4 jondawson
import struct
6
 
7 2 jondawson
class NotConstant(Exception):
8 4 jondawson
    pass
9 2 jondawson
 
10
 
11 4 jondawson
def constant_fold(expression):
12 2 jondawson
 
13 4 jondawson
    """Replace an expression with a constant if possible"""
14 2 jondawson
 
15 4 jondawson
    try:
16
        return Constant(expression.value(), expression.type_(), expression.size(), expression.signed())
17
    except NotConstant:
18
        return expression
19 2 jondawson
 
20
 
21 4 jondawson
class Process:
22 2 jondawson
 
23 4 jondawson
    def generate(self):
24
        instructions = []
25
        for function in self.functions:
26
            if hasattr(function, "declarations"):
27
                instructions.extend(function.generate())
28 2 jondawson
 
29 4 jondawson
        instructions.append(
30
            {"op"   :"jmp_and_link",
31
             "dest" :self.main.return_address,
32
             "label":"function_%s"%id(self.main)})
33 2 jondawson
 
34 4 jondawson
        instructions.append(
35
            {"op":"stop"})
36 2 jondawson
 
37 4 jondawson
        for function in self.functions:
38
            if not hasattr(function, "declarations"):
39
                instructions.extend(function.generate())
40
        return instructions
41 2 jondawson
 
42 4 jondawson
 
43 2 jondawson
class Function:
44
 
45 4 jondawson
    def generate(self):
46
        instructions = []
47
        instructions.append({"op":"label", "label":"function_%s"%id(self)})
48
        instructions.extend(self.statement.generate())
49
        if not hasattr(self, "return_value"):
50
            instructions.append({"op":"jmp_to_reg", "src":self.return_address})
51
        return instructions
52
 
53
 
54 2 jondawson
class Break:
55
 
56 4 jondawson
    def generate(self): return [
57
        {"op":"goto", "label":"break_%s"%id(self.loop)}]
58
 
59
 
60 2 jondawson
class Continue:
61
 
62 4 jondawson
    def generate(self): return [
63
        {"op":"goto", "label":"continue_%s"%id(self.loop)}]
64
 
65
 
66 2 jondawson
class Assert:
67
 
68 4 jondawson
    def generate(self):
69
        result = self.allocator.new(self.expression.size())
70
        instructions = self.expression.generate(result, self.allocator)
71
        self.allocator.free(result)
72
 
73
        instructions.append(
74
            {"op":"assert",
75
             "src":result,
76
             "line":self.line,
77
             "file":self.filename})
78
 
79
        return instructions
80
 
81
 
82 2 jondawson
class Return:
83
 
84 4 jondawson
    def generate(self):
85
        if hasattr(self, "expression"):
86
 
87
            result = self.allocator.new(self.function.size)
88
            instructions=self.function.return_value.copy(
89
                self.expression,
90
                result,
91
                self.allocator)
92
            self.allocator.free(result)
93
 
94
        else:
95
            instructions = []
96
 
97
        instructions.append(
98
            {"op":"jmp_to_reg",
99
             "src":self.function.return_address})
100
 
101
        return instructions
102
 
103
 
104 2 jondawson
class Report:
105
 
106 4 jondawson
    def generate(self):
107
        result = self.allocator.new(self.expression.size())
108
        instructions = self.expression.generate(result, self.allocator)
109
        self.allocator.free(result)
110
 
111
        instructions.append(
112
            {"op":"report",
113
             "src":result,
114
             "line":self.line,
115
             "file":self.filename,
116
             "type":self.expression.type_(),
117
             "signed":self.expression.signed()})
118
 
119
        return instructions
120
 
121
 
122 2 jondawson
class WaitClocks:
123
 
124 4 jondawson
    def generate(self):
125
        result = self.allocator.new(self.expression.size())
126
        instructions = self.expression.generate(result, self.allocator)
127
        self.allocator.free(result)
128
        instructions.append({"op":"wait_clocks", "src":result})
129
        return instructions
130
 
131
 
132 2 jondawson
class If:
133
 
134 4 jondawson
    def generate(self):
135
 
136
        try:
137
 
138
            if self.expression.value():
139
                return self.true_statement.generate()
140
            else:
141
                if self.false_statement:
142
                    return self.false_statement.generate()
143
                else:
144
                    return []
145
 
146
        except NotConstant:
147
 
148
            result = self.allocator.new(self.expression.size())
149
            instructions = []
150
            instructions.extend(self.expression.generate(result, self.allocator))
151
 
152
            instructions.append(
153
                {"op"    : "jmp_if_false",
154
                 "src"   : result,
155
                 "label" : "else_%s"%id(self)})
156
 
157
            self.allocator.free(result)
158
            instructions.extend(self.true_statement.generate())
159
            instructions.append({"op":"goto", "label":"end_%s"%id(self)})
160
            instructions.append({"op":"label", "label":"else_%s"%id(self)})
161
            if self.false_statement:
162
                instructions.extend(self.false_statement.generate())
163
            instructions.append({"op":"label", "label":"end_%s"%id(self)})
164
            return instructions
165
 
166
 
167 2 jondawson
class Switch:
168
 
169 4 jondawson
    def generate(self):
170
        result = self.allocator.new(self.expression.size())
171
        test = self.allocator.new(self.expression.size())
172
        instructions = self.expression.generate(result, self.allocator)
173
        for value, case in self.cases.iteritems():
174
 
175
            instructions.append(
176
                {"op":"==",
177
                 "dest":test,
178
                 "src":result,
179
                 "right":value,
180
                 "size": self.expression.size(),
181
                 "signed":True})
182
 
183
            instructions.append(
184
                {"op":"jmp_if_true",
185
                 "src":test,
186
                 "label":"case_%s"%id(case)})
187
 
188
        if hasattr(self, "default"):
189
 
190
            instructions.append(
191
                {"op":"goto",
192
                 "label":"case_%s"%id(self.default)})
193
 
194
        self.allocator.free(result)
195
        self.allocator.free(test)
196
        instructions.extend(self.statement.generate())
197
        instructions.append({"op":"label", "label":"break_%s"%id(self)})
198
        return instructions
199
 
200
 
201 2 jondawson
class Case:
202
 
203 4 jondawson
    def generate(self):
204
        return [{"op":"label", "label":"case_%s"%id(self)}]
205
 
206
 
207 2 jondawson
class Default:
208
 
209 4 jondawson
    def generate(self):
210
        return [{"op":"label", "label":"case_%s"%id(self)}]
211
 
212
 
213 2 jondawson
class Loop:
214
 
215 4 jondawson
    def generate(self):
216
        instructions = [{"op":"label", "label":"begin_%s"%id(self)}]
217
        instructions.append({"op":"label", "label":"continue_%s"%id(self)})
218
        instructions.extend(self.statement.generate())
219
        instructions.append({"op":"goto", "label":"begin_%s"%id(self)})
220
        instructions.append({"op":"label", "label":"break_%s"%id(self)})
221
        return instructions
222
 
223
 
224 2 jondawson
class For:
225
 
226 4 jondawson
    def generate(self):
227
        instructions = []
228
        if hasattr(self, "statement1"):
229
            instructions.extend(self.statement1.generate())
230
        instructions.append({"op":"label", "label":"begin_%s"%id(self)})
231
        if hasattr(self, "expression"):
232
            result = self.allocator.new(self.expression.size())
233
 
234
            instructions.extend(
235
                self.expression.generate(result, self.allocator))
236
 
237
            instructions.append(
238
                {"op":"jmp_if_false",
239
                 "src":result,
240
                 "label":"end_%s"%id(self)})
241
 
242
            self.allocator.free(result)
243
        instructions.extend(self.statement3.generate())
244
        instructions.append({"op":"label", "label":"continue_%s"%id(self)})
245
        if hasattr(self, "statement2"):
246
            instructions.extend(self.statement2.generate())
247
        instructions.append({"op":"goto", "label":"begin_%s"%id(self)})
248
        instructions.append({"op":"label", "label":"end_%s"%id(self)})
249
        instructions.append({"op":"label", "label":"break_%s"%id(self)})
250
        return instructions
251
 
252
 
253 2 jondawson
class Block:
254
 
255 4 jondawson
    def generate(self):
256
        instructions = []
257
        for statement in self.statements:
258
            instructions.extend(statement.generate())
259
        return instructions
260
 
261
 
262 2 jondawson
class CompoundDeclaration:
263
 
264 4 jondawson
    def __init__(self, declarations):
265
        self.declarations = declarations
266 2 jondawson
 
267 4 jondawson
    def generate(self):
268
        instructions = []
269
        for declaration in self.declarations:
270
            instructions.extend(declaration.generate());
271
        return instructions
272
 
273
 
274 2 jondawson
class VariableDeclaration:
275
 
276 4 jondawson
    def __init__(self, allocator, initializer, name, type_, size, signed, const):
277
        self.initializer = initializer
278
        self.allocator = allocator
279
        self._type = type_
280
        self._size = size
281
        self._signed = signed
282
        self._const = const
283
        self.name = name
284
 
285
    def instance(self):
286
        register = self.allocator.new(self.size(), "variable "+self.name)
287
 
288
        return VariableInstance(
289
            register,
290
            self.initializer,
291
            self.type_(),
292
            self.size(),
293
            self.signed(),
294
            self.const(),
295
            self.allocator)
296
 
297
    def type_(self):
298
        return self._type
299
 
300
    def size(self):
301
        return self._size
302
 
303
    def signed(self):
304
        return self._signed
305
 
306
    def const(self):
307
        return self._const
308
 
309
 
310 2 jondawson
class VariableInstance:
311
 
312 4 jondawson
    def __init__(self, register, initializer, type_, size, signed, const, allocator):
313
        self.register = register
314
        self._type = type_
315
        self.initializer = initializer
316
        self._size = size
317
        self._signed = signed
318
        self._const = const
319
        self.allocator = allocator
320
 
321
    def generate(self):
322
        return self.initializer.generate(self.register, self.allocator)
323
 
324
    def reference(self):
325
        return Variable(self)
326
 
327
    def type_(self):
328
        return self._type
329
 
330
    def size(self):
331
        return self._size
332
 
333
    def signed(self):
334
        return self._signed
335
 
336
    def const(self):
337
        return self._const
338
 
339
 
340 2 jondawson
class ArrayDeclaration:
341
 
342 4 jondawson
    def __init__(self,
343
                 allocator,
344
                 size,
345
                 type_,
346
                 element_type,
347
                 element_size,
348
                 element_signed,
349
                 initializer = None,
350
                 initialize_memory = False):
351 2 jondawson
 
352 4 jondawson
        self.allocator = allocator
353
        self._type = type_
354
        self._size = size
355
        self._signed = False
356
        self.element_type = element_type
357
        self.element_size = element_size
358
        self.element_signed = element_signed
359
        self.initializer = initializer
360
        self.initialize_memory = initialize_memory
361 2 jondawson
 
362 4 jondawson
    def instance(self):
363
 
364
        location = self.allocator.new_array(
365
            self.size(),
366
            self.initializer,
367
            self.element_size)
368
 
369
        register = self.allocator.new(2, "array")
370
 
371
        return ArrayInstance(
372
            location,
373
            register,
374
            self.size(),
375
            self.type_(),
376
            self.initializer,
377
            self.initialize_memory,
378
            self.element_type,
379
            self.element_size,
380
            self.element_signed)
381
 
382
    def type_(self):
383
        return self._type
384
 
385
    def size(self):
386
        return self._size
387
 
388
    def signed(self):
389
        return self._signed
390
 
391 2 jondawson
class ArrayInstance:
392
 
393 4 jondawson
    def __init__(self,
394
                 location,
395
                 register,
396
                 size,
397
                 type_,
398
                 initializer,
399
                 initialize_memory,
400
                 element_type,
401
                 element_size,
402
                 element_signed):
403 2 jondawson
 
404 4 jondawson
        self.register = register
405
        self.location = location
406
        self._type = type_
407
        self._size = size * element_size
408
        self._signed = False
409
        self.element_type = element_type
410
        self.element_size = element_size
411
        self.element_signed = element_signed
412
        self.initializer = initializer
413
        self.initialize_memory = initialize_memory
414 2 jondawson
 
415 4 jondawson
    def generate(self, result=None):
416
        instructions = []
417
        #If initialize memory is true, the memory content will initialised (as at configuration time)
418
        #If initialize memory is false, then the memory will need to be filled by the program.
419
        if not self.initialize_memory and self.initializer is not None:
420
            location=self.location
421
            for value in self.initializer:
422
 
423
                instructions.append(
424
                    {"op":"memory_write_literal",
425
                     "address":location,
426
                     "value":value,
427
                     "element_size":self.element_size})
428
                location += 1
429
 
430
        instructions.append(
431
            {"op":"literal",
432
             "literal":self.location,
433
             "dest":self.register})
434
 
435
        return instructions
436
 
437
 
438
    def reference(self):
439
        return Array(self)
440
 
441
    def type_(self):
442
        return self._type
443
 
444
    def size(self):
445
        return self._size
446
 
447
    def signed(self):
448
        return self._signed
449
 
450
 
451 2 jondawson
class StructDeclaration:
452
 
453 4 jondawson
    def __init__(self, members):
454
        self.members = members
455
        self._type = "struct {%s}"%"; ".join(
456
            [i.type_() for i in members.values()])
457
        self._size = sum([i.size() for i in members.values()])
458
        self._signed = False
459 2 jondawson
 
460 4 jondawson
    def instance(self):
461
        instances = {}
462
        for name, declaration in self.members.iteritems():
463
            instances[name] = declaration.instance()
464
        return StructInstance(instances)
465
 
466
    def type_(self):
467
        return self._type
468
 
469
    def size(self):
470
        return self._size
471
 
472
    def signed(self):
473
        return self._signed
474
 
475
 
476 2 jondawson
class StructInstance:
477
 
478 4 jondawson
    def __init__(self, members):
479
        self.members = members
480
        self._type = "struct {%s}"%"; ".join(
481
            [i.type_() for i in members.values()])
482
        self._size = sum([i.size() for i in members.values()])
483
        self._signed = False
484 2 jondawson
 
485 4 jondawson
    def generate(self):
486
        instructions = []
487
        for member in self.members.values():
488
            instructions.extend(member.generate())
489
        return instructions
490 2 jondawson
 
491 4 jondawson
    def reference(self):
492
        return Struct(self)
493
 
494
    def type_(self):
495
        return self._type
496
 
497
    def size(self):
498
        return self._size
499
 
500
    def signed(self):
501
        return self._signed
502
 
503
 
504 2 jondawson
class DiscardExpression:
505
 
506 4 jondawson
    def __init__(self, expression, allocator):
507
        self.expression = expression
508
        self.allocator = allocator
509 2 jondawson
 
510 4 jondawson
    def generate(self):
511
        result = self.allocator.new(self.expression.size())
512
        instructions = self.expression.generate(result, self.allocator)
513
        self.allocator.free(result)
514
        return instructions
515 2 jondawson
 
516
 
517 4 jondawson
class Expression:
518 2 jondawson
 
519 4 jondawson
    def __init__(self, t, size, signed):
520
        self.type_var=t
521
        self.size_var=size
522
        self.signed_var=signed
523
 
524
    def type_(self):
525
        return self.type_var
526
 
527
    def size(self):
528
        return self.size_var
529
 
530
    def signed(self):
531
        return self.signed_var
532
 
533
    def value(self):
534
        raise NotConstant
535
 
536
    def const(self):
537
        return True
538
 
539
    def int_value(self):
540
        if self.type_() == "float":
541
            byte_value = struct.pack(">f", self.value())
542
            value  = ord(byte_value[0]) << 24
543
            value |= ord(byte_value[1]) << 16
544
            value |= ord(byte_value[2]) << 8
545
            value |= ord(byte_value[3])
546
            return value
547
        else:
548
            return self.value()
549
 
550
 
551
class Object(Expression):
552
 
553
    def __init__(self, instance):
554
        Expression.__init__(self, instance.type_(), instance.size(), instance.signed())
555
        self.instance = instance
556
 
557
    def value(self):
558
        raise NotConstant
559
 
560
    def const(self):
561
        return False
562
 
563
 
564 2 jondawson
def AND(left, right):
565 4 jondawson
    return ANDOR(left, right, "jmp_if_false")
566 2 jondawson
 
567 4 jondawson
 
568 2 jondawson
def OR(left, right):
569 4 jondawson
    return ANDOR(left, right, "jmp_if_true")
570 2 jondawson
 
571
 
572 4 jondawson
class ANDOR(Expression):
573 2 jondawson
 
574 4 jondawson
    def __init__(self, left, right, op):
575
        self.left = constant_fold(left)
576
        self.right = constant_fold(right)
577
        self.op = op
578
 
579
        Expression.__init__(
580
            self,
581
            "int",
582
            max(left.size(), right.size()),
583
            left.signed() and right.signed())
584
 
585
    def generate(self, result, allocator):
586
        instructions = self.left.generate(result, allocator)
587
        instructions.append({"op":self.op, "src":result, "label":"end_%s"%id(self)})
588
        instructions.extend(self.right.generate(result, allocator))
589
        instructions.append({"op":"label", "label":"end_%s"%id(self)})
590
        return instructions
591
 
592
    def value(self):
593
        if self.op == "jmp_if_false":
594
            return self.left.value() and self.right.value()
595
        else:
596
            return self.left.value() or self.right.value()
597
 
598
 
599
def get_binary_type(left, right, operator):
600
    """
601
    Given the type of the left and right hand operators, determine the type
602
    of the resulting value.
603
    """
604
 
605
    binary_types = {
606
        "float,float,+"  : ("float", 4, True),
607
        "float,float,-"  : ("float", 4, True),
608
        "float,float,*"  : ("float", 4, True),
609
        "float,float,/"  : ("float", 4, True),
610
        "float,float,==" : ("int", 4, True),
611
        "float,float,!=" : ("int", 4, True),
612
        "float,float,<"  : ("int", 4, True),
613
        "float,float,>"  : ("int", 4, True),
614
        "float,float,<=" : ("int", 4, True),
615
        "float,float,>=" : ("int", 4, True)}
616
 
617
    signature = ",".join([left.type_(), right.type_(), operator])
618
    if signature in binary_types:
619
        type_, size, signed = binary_types[signature]
620 2 jondawson
    else:
621 4 jondawson
        type_ = left.type_()
622
        size = max(left.size(), right.size())
623
        signed = left.signed() and right.signed()
624 2 jondawson
 
625 4 jondawson
    return type_, size, signed
626 2 jondawson
 
627 4 jondawson
class Binary(Expression):
628 2 jondawson
 
629 4 jondawson
    def __init__(self, operator, left, right):
630
        self.left = constant_fold(left)
631
        self.right = constant_fold(right)
632
        self.operator = operator
633
        type_, size, signed = get_binary_type(left, right, operator)
634 2 jondawson
 
635 4 jondawson
        Expression.__init__(
636
            self,
637
            type_,
638
            size,
639
            signed)
640
 
641
    def generate(self, result, allocator):
642
        new_register = allocator.new(self.size())
643
        try:
644
            instructions = self.right.generate(new_register, allocator)
645
 
646
            instructions.append(
647
                {"op"  :self.operator,
648
                 "dest":result,
649
                 "left":self.left.int_value(),
650
                 "src":new_register,
651
                 "type":self.type_(),
652
                 "size":self.size(),
653
                 "signed":self.signed()})
654
 
655
        except NotConstant:
656
            try:
657
                instructions = self.left.generate(new_register, allocator)
658
 
659
                instructions.append(
660
                    {"op"   :self.operator,
661
                     "dest" :result,
662
                     "src"  :new_register,
663
                     "right":self.right.int_value(),
664
                     "type":self.type_(),
665
                     "size":self.size(),
666
                     "signed" :self.signed()})
667
 
668
            except NotConstant:
669
                instructions = self.left.generate(new_register, allocator)
670
                right = allocator.new(self.size())
671
                instructions.extend(self.right.generate(right, allocator))
672
 
673
                instructions.append(
674
                    {"op"  :self.operator,
675
                     "dest":result,
676
                     "src" :new_register,
677
                     "srcb":right,
678
                     "type":self.type_(),
679
                     "size":self.size(),
680
                     "signed":self.signed()})
681
 
682
                allocator.free(right)
683
        allocator.free(new_register)
684
        return instructions
685
 
686
    def value(self):
687
 
688
        if self.type_() == "int":
689
 
690
            return int(eval("%s %s %s"%(
691
                self.left.value(),
692
                self.operator,
693
                self.right.value())))
694
 
695
        else:
696
 
697
            return float(eval("%s %s %s"%(
698
                self.left.value(),
699
                self.operator,
700
                self.right.value())))
701
 
702
 
703
 
704 2 jondawson
def SizeOf(expression):
705 4 jondawson
    return Constant(expression.size())
706 2 jondawson
 
707
 
708 4 jondawson
class IntToFloat(Expression):
709 2 jondawson
 
710 4 jondawson
    def __init__(self, expression):
711
        self.expression = constant_fold(expression)
712 2 jondawson
 
713 4 jondawson
        Expression.__init__( self, "float", 4, True)
714 2 jondawson
 
715 4 jondawson
    def generate(self, result, allocator):
716
        new_register = allocator.new(self.size())
717
        instructions = self.expression.generate(new_register, allocator)
718 2 jondawson
 
719 4 jondawson
        instructions.extend([
720
            {"op"   : "int_to_float",
721
             "dest" : result,
722
             "src"  : new_register}])
723 2 jondawson
 
724 4 jondawson
        allocator.free(new_register)
725
        return instructions
726 2 jondawson
 
727 4 jondawson
    def value(self):
728
        return float(self.expression.value())
729 2 jondawson
 
730
 
731 4 jondawson
class FloatToInt(Expression):
732 2 jondawson
 
733 4 jondawson
    def __init__(self, expression):
734
        self.expression = constant_fold(expression)
735 2 jondawson
 
736 4 jondawson
        Expression.__init__( self, "int", 4, True)
737 2 jondawson
 
738 4 jondawson
    def generate(self, result, allocator):
739
        new_register = allocator.new(self.size())
740
        instructions = self.expression.generate(new_register, allocator)
741 2 jondawson
 
742 4 jondawson
        instructions.extend([
743
            {"op"   : "float_to_int",
744
             "dest" : result,
745
             "src"  : new_register}])
746 2 jondawson
 
747 4 jondawson
        allocator.free(new_register)
748
        return instructions
749 2 jondawson
 
750 4 jondawson
    def value(self):
751
        return int(self.expression.value())
752 2 jondawson
 
753
 
754 4 jondawson
class Unary(Expression):
755 2 jondawson
 
756 4 jondawson
    def __init__(self, operator, expression):
757
        self.expression = constant_fold(expression)
758
        self.operator = operator
759 2 jondawson
 
760 4 jondawson
        Expression.__init__(
761
            self,
762
            expression.type_(),
763
            expression.size(),
764
            expression.signed())
765 2 jondawson
 
766 4 jondawson
    def generate(self, result, allocator):
767
        new_register = allocator.new(self.size())
768
        instructions = self.expression.generate(new_register, allocator)
769 2 jondawson
 
770 4 jondawson
        instructions.extend([
771
            {"op":self.operator,
772
             "dest":result,
773
             "src":new_register}])
774 2 jondawson
 
775 4 jondawson
        allocator.free(new_register)
776
        return instructions
777 2 jondawson
 
778 4 jondawson
    def value(self):
779
        return eval("%s%s"%(self.operator, self.expression.value()))
780 2 jondawson
 
781
 
782 4 jondawson
class FunctionCall(Expression):
783 2 jondawson
 
784 4 jondawson
    def __init__(self, function):
785
        self.function = function
786 2 jondawson
 
787 4 jondawson
        Expression.__init__(
788
            self,
789
            function.type_,
790
            function.size,
791
            function.signed)
792 2 jondawson
 
793 4 jondawson
    def generate(self, result, allocator):
794
        instructions = []
795 2 jondawson
 
796 4 jondawson
        for expression, argument in zip(
797
            self.arguments,
798
            self.function.arguments):
799 2 jondawson
 
800 4 jondawson
            temp_register = allocator.new(expression.size())
801
            instructions.extend(
802
                argument.copy(expression, temp_register, allocator))
803
            allocator.free(temp_register)
804 2 jondawson
 
805 4 jondawson
        instructions.append(
806
            {"op"   :"jmp_and_link",
807
             "dest" :self.function.return_address,
808
             "label":"function_%s"%id(self.function)})
809
 
810
        if hasattr(self.function, "return_value"):
811
 
812
            instructions.extend(self.function.return_value.generate(
813
                result,
814
                allocator))
815
 
816
        return instructions
817
 
818
 
819
class Output(Expression):
820
 
821
    def __init__(self, name, expression):
822
        self.name = name
823
        self.expression = expression
824
        Expression.__init__(self, "int", 2, True)
825
 
826
    def generate(self, result, allocator):
827
        instructions = self.expression.generate(result, allocator)
828
 
829
        instructions.append(
830
            {"op"   :"write",
831
             "src"  :result,
832
             "output":self.name})
833
 
834
        return instructions
835
 
836
 
837
class FileWrite(Expression):
838
 
839
    def __init__(self, name, expression):
840
        self.name = name
841
        self.expression = expression
842
        Expression.__init__(
843
            self,
844
            expression.type_(),
845
            expression.size(),
846
            expression.signed())
847
 
848
    def generate(self, result, allocator):
849
        instructions = self.expression.generate(result, allocator)
850
 
851
        instructions.append(
852
            {"op"   :"file_write",
853
             "src"  :result,
854
             "type":self.expression.type_(),
855
             "file_name":self.name})
856
 
857
        return instructions
858
 
859
 
860
class Input(Expression):
861
 
862
    def __init__(self, name):
863
        self.name = name
864
        Expression.__init__(self, "int", 2, True)
865
 
866
    def generate(self, result, allocator):
867
        return [{"op"   :"read", "dest" :result, "input":self.name}]
868
 
869
 
870
class FileRead(Expression):
871
 
872
    def __init__(self, name):
873
        self.name = name
874
        Expression.__init__(self, "int", 2, True)
875
 
876
    def generate(self, result, allocator):
877
        return [{"op"   :"file_read", "dest" :result, "file_name":self.name}]
878
 
879
 
880
class Ready(Expression):
881
 
882
    def __init__(self, name):
883
        self.name = name
884
        Expression.__init__(self, "int", 2, True)
885
 
886
    def generate(self, result, allocator):
887
        return [{"op"   :"ready", "dest" :result, "input":self.name}]
888
 
889
 
890
class Struct(Object):
891
 
892
    def __init__(self, instance):
893
        Object.__init__(self, instance)
894
 
895
    def generate(self, result, allocator):
896
        instructions = []
897
        if result != self.declaration.register:
898
 
899
            instructions.append(
900
                {"op"  :"move",
901
                 "dest":result,
902
                 "src" :self.declaration.register})
903
 
904
        return instructions
905
 
906
    def copy(self, expression, result, allocator):
907
        instructions = []
908
 
909
        for lvalue, rvalue in zip(
910
            self.instance.members.values(),
911
            expression.instance.members.values()):
912
 
913
            instructions.extend(
914
                lvalue.reference().copy(rvalue.reference(), result, allocator))
915
 
916
        return instructions
917
 
918
 
919
class Array(Object):
920
 
921
    def __init__(self, instance):
922
        Object.__init__(self, instance)
923
 
924
    def generate(self, result, allocator):
925
        instructions = []
926
        if result != self.instance.register:
927
 
928
            instructions.append(
929
                {"op"   : "move",
930
                 "dest" : result,
931
                 "src"  : self.instance.register})
932
 
933
        return instructions
934
 
935
    def copy(self, expression, result, allocator):
936
        instructions = expression.generate(result, allocator)
937
        if result != self.instance.register:
938
 
939
            instructions.append(
940
                {"op"   : "move",
941
                 "dest" : self.instance.register,
942
                 "src"  : result})
943
 
944
        return instructions
945
 
946
 
947
class ConstArray(Object):
948
 
949
    def __init__(self, instance):
950
        Object.__init__(self, instance)
951
 
952
    def generate(self, result, allocator):
953
        instructions = []
954
        #If initialize memory is true, the memory content will initialised (as at configuration time)
955
        #If initialize memory is false, then the memory will need to be filled by the program.
956
        if not self.instance.initialize_memory and self.instance.initializer is not None:
957
            location = self.instance.location
958
            for value in self.instance.initializer:
959
 
960
                instructions.append(
961
                    {"op":"memory_write_literal",
962
                     "address":location,
963
                     "value":value,
964
                     "element_size":self.instance.element_size})
965
 
966
                location += 1
967
 
968
        instructions.append(
969
            {"op":"literal",
970
             "literal":self.instance.location,
971
             "dest":self.instance.register})
972
 
973
        if result != self.instance.register:
974
 
975
            instructions.append(
976
                {"op"   : "move",
977
                 "dest" : result,
978
                 "src"  : self.instance.register})
979
 
980
        return instructions
981
 
982
    def copy(self, expression, result, allocator):
983
        instructions = expression.generate(result, allocator)
984
        if result != self.instance.register:
985
 
986
            instructions.append(
987
                {"op"   : "move",
988
                 "dest" : self.instance.register,
989
                 "src"  : result})
990
 
991
        return instructions
992
 
993
 
994
class ArrayIndex(Object):
995
 
996
    def __init__(self, instance, index_expression):
997
        Object.__init__(self, instance)
998
        assert self.type_var.endswith("[]")
999
        self.type_var = self.type_var[:-2]
1000
        self.size_var = instance.element_size
1001
        self.index_expression = index_expression
1002
 
1003
    def generate(self, result, allocator):
1004
        instructions = []
1005
        offset = allocator.new(2)
1006
        address = allocator.new(2)
1007
        instructions.extend(self.index_expression.generate(offset, allocator))
1008
 
1009
        instructions.append(
1010
            {"op"    :"+",
1011
             "dest"  :address,
1012
             "src"   :offset,
1013
             "srcb"  :self.instance.register,
1014
             "signed":False})
1015
 
1016
        instructions.append(
1017
            {"op"    :"memory_read_request",
1018
             "src"   :address,
1019
             "sequence": id(self),
1020
             "element_size":self.size()})
1021
 
1022
        instructions.append(
1023
            {"op"    :"memory_read_wait",
1024
             "src"   :address,
1025
             "sequence": id(self),
1026
             "element_size":self.size()})
1027
 
1028
        instructions.append(
1029
            {"op"    :"memory_read",
1030
             "src"   :address,
1031
             "dest"  :result,
1032
             "sequence": id(self),
1033
             "element_size":self.size()})
1034
 
1035
        allocator.free(address)
1036
        allocator.free(offset)
1037
        return instructions
1038
 
1039
    def copy(self, expression, result, allocator):
1040
        index = allocator.new(2)
1041
        address = allocator.new(2)
1042
        instructions = expression.generate(result, allocator)
1043
        instructions.extend(self.index_expression.generate(index, allocator))
1044
 
1045
        instructions.append(
1046
            {"op"     :"+",
1047
             "dest"   :address,
1048
             "src"    :index,
1049
             "srcb"   :self.instance.register,
1050
             "signed" :expression.signed()})
1051
 
1052
        instructions.append(
1053
            {"op"    :"memory_write",
1054
             "src"   :address,
1055
             "srcb"  :result,
1056
             "element_size" :self.instance.element_size})
1057
 
1058
        allocator.free(index)
1059
        allocator.free(address)
1060
        return instructions
1061
 
1062
 
1063
class Variable(Object):
1064
    def __init__(self, instance):
1065
        Object.__init__(self, instance)
1066
 
1067
    def generate(self, result, allocator):
1068
        instructions = []
1069
        if result != self.instance.register:
1070
 
1071
            instructions.append(
1072
                {"op"  :"move",
1073
                 "dest":result,
1074
                 "src" :self.instance.register})
1075
 
1076
        return instructions
1077
 
1078
    def copy(self, expression, result, allocator):
1079
        instructions = expression.generate(result, allocator)
1080
        if result != self.instance.register:
1081
 
1082
            instructions.append(
1083
                {"op"   : "move",
1084
                 "dest" : self.instance.register,
1085
                 "src"  : result})
1086
 
1087
        return instructions
1088
 
1089
    def const(self):
1090
        return self.instance.const()
1091
 
1092
    def value(self):
1093
        if self.const():
1094
            return self.instance.initializer.value()
1095
        else:
1096
            raise NotConstant
1097
 
1098
 
1099
class PostIncrement(Expression):
1100
 
1101
    def  __init__(self, operator, lvalue, allocator):
1102
        self.operator = operator
1103
        self.lvalue = lvalue
1104
        allocator = allocator
1105
        Expression.__init__(self, lvalue.type_(), lvalue.size(), lvalue.signed())
1106
 
1107
    def generate(self, result, allocator):
1108
 
1109
        instructions = []
1110
 
1111
        instructions.append(
1112
            {"op"    : "move",
1113
             "src"   : self.lvalue.instance.register,
1114
             "dest"  : result})
1115
 
1116
        instructions.append(
1117
            {"op"    : self.operator,
1118
             "dest"  : self.lvalue.instance.register,
1119
             "right" : 1,
1120
             "src"   : self.lvalue.instance.register,
1121
             "size"  : self.size(),
1122
             "signed": self.signed()})
1123
 
1124
        return instructions
1125
 
1126
 
1127
class Assignment(Expression):
1128
 
1129
    def __init__(self, lvalue, expression, allocator):
1130
        Expression.__init__(self, lvalue.type_(), lvalue.size(), lvalue.signed())
1131
        self.lvalue = lvalue
1132
        self.expression = expression
1133
        self.allocator = allocator
1134
 
1135
    def generate(self, result, allocator):
1136
        return self.lvalue.copy(self.expression, result, allocator)
1137
 
1138
 
1139
class Constant(Expression):
1140
 
1141
    def __init__(self, value, type_="int", size=2, signed=True):
1142
        self._value = value
1143
        Expression.__init__(self, type_, size, signed)
1144
 
1145
    def generate(self, result, allocator):
1146
 
1147
        instructions = [{
1148
            "op":"literal",
1149
            "dest":result,
1150
            "size":self.size(),
1151
            "signed":self.size(),
1152
            "literal":self.int_value()}]
1153
        return instructions
1154
 
1155
    def value(self):
1156
       return self._value
1157
 
1158
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.