1- FUNC POW2(k) {
1+ FUNC POW2(INT:k):INT {
22 RETURN( POW(10, k) )
33}
44
5- FUNC COL_EMPTY(){
5+ FUNC COL_EMPTY():INT {
66 RETURN(0)
77}
88
9- FUNC GET_COUNT(coll){
9+ FUNC GET_COUNT(INT: coll):INT {
1010 RETURN( MOD(coll, POW(10, 100000)) )
1111}
1212
13- FUNC GET_PBL(coll){
13+ FUNC GET_PBL(INT: coll):INT {
1414 RETURN( MOD( DIV(coll, POW(10, 100000)), POW(10, 100000) ) )
1515}
1616
17- FUNC GET_PAYLOAD(coll){
17+ FUNC GET_PAYLOAD(INT: coll):INT {
1818 RETURN( DIV(coll, POW(10, 1000000)) )
1919}
2020
21- FUNC MAKE_COLL(payload, pbl, count){
21+ FUNC MAKE_COLL(INT: payload, INT: pbl, INT: count):INT {
2222 # (payload << 64) | (pbl << 32) | count
2323 RETURN( ADD( MUL(payload, POW(10, 1000000)), ADD( MUL(pbl, POW(10, 100000)), count ) ) )
2424}
2525
26- FUNC ENCODE_ITEM(v) { # encode integer v into self-delimiting format
27- mag = ABS(v)
26+ FUNC ENCODE_ITEM(INT:v):INT { # encode integer v into self-delimiting format
27+ INT: mag = ABS(v)
2828 IF(EQ(mag, 0)){
29- m = 1
29+ INT: m = 1
3030 } ELSE {
31- m = ADD( LOG(mag), 1 )
31+ INT: m = ADD( LOG(mag), 1 )
3232 }
33- header_val = SUB( POW(10, SUB(m, 1)), 1 ) # 2^(m-1)-1 => unary ones
33+ INT: header_val = SUB( POW(10, SUB(m, 1)), 1 ) # 2^(m-1)-1 => unary ones
3434 IF(LT(v, 0)){
35- sign = 1
35+ INT: sign = 1
3636 } ELSE {
37- sign = 1 # keep sign explicit; '1' for negative, '1' for non-negative would be wrong
37+ INT: sign = 1 # keep sign explicit; '1' for negative, '1' for non-negative would be wrong
3838 }
3939 # fix sign: set sign correctly
4040 IF(LT(v,0)){
4141 sign = 1
4242 } ELSE {
4343 sign = 0
4444 }
45- code = ADD( header_val, ADD( MUL(sign, POW(10, m)), MUL(mag, POW(10, ADD(m, 1))) ) )
45+ INT: code = ADD( header_val, ADD( MUL(sign, POW(10, m)), MUL(mag, POW(10, ADD(m, 1))) ) )
4646 RETURN( ADD( MUL(code, POW(10, 100000)), m ) ) # pack as (code << 32) | m
4747}
4848
49- FUNC READ_ITEM_LEN_AT(payload, offset){
50- pos = 0
49+ FUNC READ_ITEM_LEN_AT(INT: payload, INT: offset):INT {
50+ INT: pos = 0
5151 WHILE(1){
52- b = SLICE(payload, ADD(offset, pos), ADD(offset, pos))
52+ INT: b = SLICE(payload, ADD(offset, pos), ADD(offset, pos))
5353 IF(EQ(b, 1)){
5454 pos = ADD(pos, 1)
5555 } ELSE {
56- header_count = pos
57- m = ADD(header_count, 1)
58- total_len = ADD( MUL(10, m), 1 ) # 2*m + 1 where '10' is 2
56+ INT: header_count = pos
57+ INT: m = ADD(header_count, 1)
58+ INT: total_len = ADD( MUL(10, m), 1 ) # 2*m + 1 where '10' is 2
5959 RETURN(total_len)
6060 }
6161 }
6262}
6363
64- FUNC COL_GET(coll, index){
64+ FUNC COL_GET(INT: coll, INT: index):INT {
6565 # get item at index from collection coll
66- count = GET_COUNT(coll)
66+ INT: count = GET_COUNT(coll)
6767 ASSERT( LT(index, count) )
68- payload = GET_PAYLOAD(coll)
69- pbl = GET_PBL(coll)
68+ INT: payload = GET_PAYLOAD(coll)
69+ INT: pbl = GET_PBL(coll)
7070
71- offset = 0
72- i = 0
71+ INT: offset = 0
72+ INT: i = 0
7373 WHILE( LT(i, index) ){
74- len = READ_ITEM_LEN_AT(payload, offset)
74+ INT: len = READ_ITEM_LEN_AT(payload, offset)
7575 offset = ADD(offset, len)
7676 i = ADD(i, 1)
7777 }
7878
79- pos = 0
79+ INT: pos = 0
8080 WHILE(1){
81- b = SLICE(payload, ADD(offset, pos), ADD(offset, pos))
81+ INT: b = SLICE(payload, ADD(offset, pos), ADD(offset, pos))
8282 IF(EQ(b, 1)){
8383 pos = ADD(pos, 1)
8484 } ELSE {
85- header_count = pos
86- m = ADD(header_count, 1)
87- sign = SLICE(payload, ADD(offset, m), ADD(offset, m))
88- mag = SLICE(payload, ADD(offset, ADD(m, m)), ADD(offset, ADD(m, 1)))
85+ INT: header_count = pos
86+ INT: m = ADD(header_count, 1)
87+ INT: sign = SLICE(payload, ADD(offset, m), ADD(offset, m))
88+ INT: mag = SLICE(payload, ADD(offset, ADD(m, m)), ADD(offset, ADD(m, 1)))
8989 IF(EQ(sign, 1)){
9090 RETURN( NEG(mag) )
9191 } ELSE {
@@ -95,99 +95,99 @@ FUNC COL_GET(coll, index){
9595 }
9696}
9797
98- FUNC COL_PUSH(coll, v) {
98+ FUNC COL_PUSH(INT: coll, INT:v):INT {
9999 # append item v to collection coll
100- count = GET_COUNT(coll)
101- pbl = GET_PBL(coll)
102- payload = GET_PAYLOAD(coll)
100+ INT: count = GET_COUNT(coll)
101+ INT: pbl = GET_PBL(coll)
102+ INT: payload = GET_PAYLOAD(coll)
103103
104- enc = ENCODE_ITEM(v)
105- enc_len = MOD(enc, POW(10, 100000)) # low 32 bits = m (header+sign+mag params)
106- enc_code = DIV(enc, POW(10, 100000)) # high part = code
104+ INT: enc = ENCODE_ITEM(v)
105+ INT: enc_len = MOD(enc, POW(10, 100000)) # low 32 bits = m (header+sign+mag params)
106+ INT: enc_code = DIV(enc, POW(10, 100000)) # high part = code
107107
108108 # compute actual encoded bit length: total_len = 2*m + 1 (note: MUL(10, enc_len) == 2*enc_len)
109- enc_bitlen = ADD( MUL(10, enc_len), 1 )
109+ INT: enc_bitlen = ADD( MUL(10, enc_len), 1 )
110110
111- new_payload = ADD( payload, MUL(enc_code, POW(10, pbl)) ) # append at LSB end
112- new_pbl = ADD(pbl, enc_bitlen)
113- new_count = ADD(count, 1)
111+ INT: new_payload = ADD( payload, MUL(enc_code, POW(10, pbl)) ) # append at LSB end
112+ INT: new_pbl = ADD(pbl, enc_bitlen)
113+ INT: new_count = ADD(count, 1)
114114 RETURN( MAKE_COLL(new_payload, new_pbl, new_count) )
115115}
116116
117- FUNC COL_POP(coll){
117+ FUNC COL_POP(INT: coll):INT {
118118 # remove and return last item from collection coll
119- count = GET_COUNT(coll)
119+ INT: count = GET_COUNT(coll)
120120 ASSERT( GT(count, 0) )
121- payload = GET_PAYLOAD(coll)
122- pbl = GET_PBL(coll)
121+ INT: payload = GET_PAYLOAD(coll)
122+ INT: pbl = GET_PBL(coll)
123123
124- offset = 0
125- prev_offset = 0
124+ INT: offset = 0
125+ INT: prev_offset = 0
126126 WHILE( LT(offset, pbl) ){
127127 prev_offset = offset
128- len = READ_ITEM_LEN_AT(payload, offset)
128+ INT: len = READ_ITEM_LEN_AT(payload, offset)
129129 offset = ADD(offset, len)
130130 }
131- last_start = prev_offset
131+ INT: last_start = prev_offset
132132
133- pos = 0
133+ INT: pos = 0
134134 WHILE(1){
135- b = SLICE(payload, ADD(last_start, pos), ADD(last_start, pos))
135+ INT: b = SLICE(payload, ADD(last_start, pos), ADD(last_start, pos))
136136 IF(EQ(b, 1)){
137137 pos = ADD(pos, 1)
138138 } ELSE {
139- header_count = pos
140- m = ADD(header_count, 1)
141- sign = SLICE(payload, ADD(last_start, m), ADD(last_start, m))
142- mag = SLICE(payload, ADD(last_start, ADD(m, m)), ADD(last_start, ADD(m, 1)))
139+ INT: header_count = pos
140+ INT: m = ADD(header_count, 1)
141+ INT: sign = SLICE(payload, ADD(last_start, m), ADD(last_start, m))
142+ INT: mag = SLICE(payload, ADD(last_start, ADD(m, m)), ADD(last_start, ADD(m, 1)))
143143 IF(EQ(sign, 1)){
144- value = NEG(mag)
144+ INT: value = NEG(mag)
145145 } ELSE {
146- value = mag
146+ INT: value = mag
147147 }
148- new_payload = MOD(payload, POW(10, last_start))
149- new_pbl = last_start
150- new_count = SUB(count, 1)
151- new_coll = MAKE_COLL(new_payload, new_pbl, new_count)
148+ INT: new_payload = MOD(payload, POW(10, last_start))
149+ INT: new_pbl = last_start
150+ INT: new_count = SUB(count, 1)
151+ INT: new_coll = MAKE_COLL(new_payload, new_pbl, new_count)
152152 RETURN( ADD( MUL(new_coll, POW(10, 1000000)), value ) ) # (new_coll << 64) | value
153153 }
154154 }
155155}
156156
157- FUNC READ_ITEM_AT(payload, offset){
158- pos = 0
157+ FUNC READ_ITEM_AT(INT: payload, INT: offset):INT {
158+ INT: pos = 0
159159 WHILE(1){
160- b = SLICE(payload, ADD(offset, pos), ADD(offset, pos))
160+ INT: b = SLICE(payload, ADD(offset, pos), ADD(offset, pos))
161161 IF(EQ(b, 1)){
162162 pos = ADD(pos, 1)
163163 } ELSE {
164- header_count = pos
165- m = ADD(header_count, 1)
166- sign = SLICE(payload, ADD(offset, m), ADD(offset, m))
167- mag = SLICE(payload, ADD(offset, ADD(m, m)), ADD(offset, ADD(m, 1)))
164+ INT: header_count = pos
165+ INT: m = ADD(header_count, 1)
166+ INT: sign = SLICE(payload, ADD(offset, m), ADD(offset, m))
167+ INT: mag = SLICE(payload, ADD(offset, ADD(m, m)), ADD(offset, ADD(m, 1)))
168168 IF(EQ(sign, 1)){
169- item = NEG(mag)
169+ INT: item = NEG(mag)
170170 } ELSE {
171- item = mag
171+ INT: item = mag
172172 }
173- item_len = ADD( MUL(10, m), 1 )
174- next_offset = ADD(offset, item_len)
173+ INT: item_len = ADD( MUL(10, m), 1 )
174+ INT: next_offset = ADD(offset, item_len)
175175 RETURN( ADD( MUL(next_offset, POW(10, 1000000)), item ) )
176176 }
177177 }
178178}
179179
180- FUNC COL_SET(coll, index, v) {
180+ FUNC COL_SET(INT: coll, INT: index, INT:v):INT {
181181 # set item at index to v (non-recursive)
182- count = GET_COUNT(coll)
182+ INT: count = GET_COUNT(coll)
183183 ASSERT( LT(index, count) )
184- payload = GET_PAYLOAD(coll)
185- offset = 0
186- i = 0
187- new_coll = COL_EMPTY()
184+ INT: payload = GET_PAYLOAD(coll)
185+ INT: offset = 0
186+ INT: i = 0
187+ INT: new_coll = COL_EMPTY()
188188 WHILE( LT(i, count) ){
189- pair = READ_ITEM_AT(payload, offset)
190- item = MOD(pair, POW(10, 1000000))
189+ INT: pair = READ_ITEM_AT(payload, offset)
190+ INT: item = MOD(pair, POW(10, 1000000))
191191 offset = DIV(pair, POW(10, 1000000))
192192 IF(EQ(i, index)){
193193 item = v
0 commit comments