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

Subversion Repositories igor

[/] [igor/] [trunk/] [simulator/] [print.c] - Blame information for rev 4

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 4 atypic
#include <stdio.h>
2
#include <inttypes.h>
3
 
4
#include "print.h"
5
#include "object.h"
6
#include "regs.h"
7
#include "memory.h"
8
 
9
uint8_t currently_printing[MEMORY_ADDRESS_SPACE_SIZE];
10
 
11
void
12
print_init(void)
13
{
14
        int i;
15
        for (i = 0; i < DEFAULT_MEMORY_SIZE; i++)
16
                currently_printing[i] = 0;
17
}
18
 
19
void
20
print_list(uint32_t addr, int first)
21
{
22
        reg_t val = memory_get(addr);
23
        int32_t datum = object_get_datum(val);
24
        uint32_t type = object_get_type(val);
25
 
26
        if (type == TYPE_CONS) {
27
                reg_t cdr = memory_get(addr+1);
28
                if (object_get_type(cdr) != TYPE_SNOC) {
29
                        printf("#(0x%X:malformed cons cell: second part has type 0x%X)",
30
                               addr, object_get_type(cdr));
31
                        return;
32
                }
33
                printf(first ? "(" : " ");
34
                print(datum);
35
                print_list(object_get_datum(cdr), 0);
36
        } else if (type == TYPE_NIL) {
37
                printf(")");
38
        } else {
39
                printf(" . ");
40
                print(addr);
41
                printf(")");
42
        }
43
}
44
 
45
void
46
print_array(uint32_t addr)
47
{
48
        reg_t val = memory_get(addr);
49
        int i;
50
        int sz = object_get_datum(val);
51
        int str = 1;
52
 
53
        for (i = 0; i < sz; i++) {
54
                val = memory_get(addr+i+1);
55
                if (object_get_type(val) != TYPE_PTR) {
56
                        printf("#(0x%X:malformed array)", addr);
57
                        return;
58
                }
59
                val = memory_get(object_get_datum(val));
60
                if (object_get_type(val) != TYPE_CHAR) {
61
                        str = 0;
62
                        break;
63
                }
64
        }
65
 
66
        if (str) {
67
                printf("\"");
68
                for (i = 0; i < sz; i++) {
69
                        val = memory_get(addr+i+1);
70
                        val = memory_get(object_get_datum(val));
71
                        printf("%c", object_get_datum(val));
72
                }
73
                printf("\"");
74
        } else {
75
                printf("#(0x%X:array(%d)", addr, sz);
76
                for (i = 0; i < sz; i++) {
77
                        printf(" ");
78
                        print(object_get_datum(memory_get(addr+i+1)));
79
                }
80
                printf(")");
81
        }
82
}
83
 
84
void
85
print_symbol(uint32_t addr)
86
{
87
        reg_t val = memory_get(addr);
88
        uint32_t arr_addr = object_get_datum(val);
89
        reg_t arr = memory_get(arr_addr);
90
        int sz = 0, i = 0;
91
        if (object_get_type(arr) != TYPE_ARRAY)
92
                goto print_symbol_err;
93
        sz = object_get_datum(arr);
94
        for (i = 1; i <= sz; i++) {
95
                val = memory_get(arr_addr+i);
96
                if (object_get_type(val) != TYPE_PTR)
97
                        goto print_symbol_err;
98
                val = memory_get(object_get_datum(val));
99
                if (object_get_type(val) != TYPE_CHAR)
100
                        goto print_symbol_err;
101
                printf("%c", object_get_datum(val));
102
        }
103
 
104
        return;
105
print_symbol_err:
106
        printf("#(0x%X:malformed symbol [%X,%X])", addr, sz, i);
107
}
108
 
109
void
110
print_function(uint32_t addr)
111
{
112
        reg_t val = memory_get(addr);
113
        int32_t datum = object_get_datum(val);
114
 
115
        printf("#(0x%X:func ", addr);
116
        print(object_get_datum(memory_get(datum)));
117
        printf(")");
118
        /*
119
        printf("#(0x%X:function ", addr);
120
        print(datum);
121
        printf(")");
122
        */
123
}
124
 
125
void
126
print_builtin(uint32_t addr)
127
{
128
        reg_t val = memory_get(addr);
129
        int32_t datum = object_get_datum(val);
130
 
131
        printf("#(builtin ");
132
        print(datum);
133
        printf(")");
134
}
135
 
136
void
137
print(uint32_t addr)
138
{
139
        reg_t val = memory_get(addr);
140
        int32_t datum = object_get_datum(val);
141
        uint32_t type = object_get_type(val);
142
 
143
        if (currently_printing[addr]) {
144
                printf("#(R 0x%X:%X:%X)", addr, type, datum);
145
                return;
146
        }
147
 
148
        currently_printing[addr] = 1;
149
 
150
        switch (object_get_type(val)) {
151
        case TYPE_NONE:
152
                printf("#(0x%X:none)", addr);
153
                break;
154
        case TYPE_INT:
155
                printf("%d", datum);
156
                break;
157
        case TYPE_FLOAT:
158
                printf("%f", (float)datum);
159
                break;
160
        case TYPE_CONS:
161
                print_list(addr, 1);
162
                break;
163
        case TYPE_SNOC:
164
                printf("#(0x%X:snoc ", addr);
165
                print(datum);
166
                printf(")");
167
                break;
168
        case TYPE_PTR:
169
                printf("#(0x%X:ptr ", addr);
170
                print(datum);
171
                printf(")");
172
                break;
173
        case TYPE_ARRAY:
174
                print_array(addr);
175
                break;
176
        case TYPE_NIL:
177
                printf("nil");
178
                break;
179
        case TYPE_T:
180
                printf("t");
181
                break;
182
        case TYPE_CHAR:
183
                printf("#\\%c", datum);
184
                break;
185
        case TYPE_SYMBOL:
186
                print_symbol(addr);
187
                break;
188
        case TYPE_FUNCTION:
189
                print_function(addr);
190
                break;
191
        case TYPE_BUILTIN:
192
                print_builtin(addr);
193
                break;
194
        default:
195
                printf("#(0x%X:invalid object %X:%X)", addr, type, datum);
196
                break;
197
        }
198
 
199
        currently_printing[addr] = 0;
200
}
201
 

powered by: WebSVN 2.1.0

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