vyre-libs 0.6.3

vyre Category A library ecosystem - pure-IR compositions over vyre-ops hardware primitives
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
use crate::parsing::go::lex::{TOK_LBRACE, TOK_LPAREN, TOK_RBRACE, TOK_RPAREN, TOK_STRING};
use crate::parsing::go::parse::token_predicates::{
    token_is_ident, token_is_keyword, token_len, token_start, token_type_eq,
};
use crate::region::wrap_anonymous;
use vyre::ir::{BufferAccess, BufferDecl, DataType, Expr, Node, Program};

/// Words per emitted Go declaration record.
pub const GO_DECL_RECORD_WORDS: u32 = 5;
/// Words per emitted Go span record.
pub const GO_SPAN_RECORD_WORDS: u32 = 2;
/// Function declaration kind.
pub const GO_DECL_FUNC: u32 = 1;
/// Method declaration kind.
pub const GO_DECL_METHOD: u32 = 2;
/// Interface declaration kind.
pub const GO_DECL_INTERFACE: u32 = 3;

/// Extract `package` declarations and imported string spans.
#[must_use]
#[allow(clippy::too_many_arguments)]
pub fn go_extract_packages_and_imports(
    tok_types: &str,
    tok_starts: &str,
    tok_lens: &str,
    haystack: &str,
    num_tokens: Expr,
    out_packages: &str,
    out_package_counts: &str,
    out_imports: &str,
    out_import_counts: &str,
) -> Program {
    let t = Expr::gid_x();
    let body = vec![
        Node::if_then(
            Expr::lt(Expr::add(t.clone(), Expr::u32(1)), num_tokens.clone()),
            vec![Node::if_then(
                token_is_keyword(
                    haystack,
                    tok_types,
                    tok_starts,
                    tok_lens,
                    t.clone(),
                    b"package",
                ),
                vec![Node::if_then(
                    token_is_ident(tok_types, Expr::add(t.clone(), Expr::u32(1))),
                    vec![
                        Node::let_bind(
                            "pkg_idx",
                            Expr::atomic_add(
                                out_package_counts,
                                Expr::u32(0),
                                Expr::u32(GO_SPAN_RECORD_WORDS),
                            ),
                        ),
                        Node::store(
                            out_packages,
                            Expr::var("pkg_idx"),
                            token_start(tok_starts, Expr::add(t.clone(), Expr::u32(1))),
                        ),
                        Node::store(
                            out_packages,
                            Expr::add(Expr::var("pkg_idx"), Expr::u32(1)),
                            token_len(tok_lens, Expr::add(t.clone(), Expr::u32(1))),
                        ),
                    ],
                )],
            )],
        ),
        Node::if_then(
            Expr::lt(Expr::add(t.clone(), Expr::u32(1)), num_tokens.clone()),
            vec![Node::if_then(
                token_is_keyword(
                    haystack,
                    tok_types,
                    tok_starts,
                    tok_lens,
                    t.clone(),
                    b"import",
                ),
                vec![
                    Node::if_then(
                        token_type_eq(tok_types, Expr::add(t.clone(), Expr::u32(1)), TOK_STRING),
                        vec![
                            Node::let_bind(
                                "import_idx",
                                Expr::atomic_add(
                                    out_import_counts,
                                    Expr::u32(0),
                                    Expr::u32(GO_SPAN_RECORD_WORDS),
                                ),
                            ),
                            Node::store(
                                out_imports,
                                Expr::var("import_idx"),
                                token_start(tok_starts, Expr::add(t.clone(), Expr::u32(1))),
                            ),
                            Node::store(
                                out_imports,
                                Expr::add(Expr::var("import_idx"), Expr::u32(1)),
                                token_len(tok_lens, Expr::add(t.clone(), Expr::u32(1))),
                            ),
                        ],
                    ),
                    Node::if_then(
                        token_type_eq(tok_types, Expr::add(t.clone(), Expr::u32(1)), TOK_LPAREN),
                        vec![
                            Node::let_bind("import_done", Expr::u32(0)),
                            Node::loop_for(
                                "scan",
                                Expr::add(t.clone(), Expr::u32(2)),
                                num_tokens.clone(),
                                vec![Node::if_then(
                                    Expr::eq(Expr::var("import_done"), Expr::u32(0)),
                                    vec![
                                        Node::if_then(
                                            token_type_eq(tok_types, Expr::var("scan"), TOK_STRING),
                                            vec![
                                                Node::let_bind(
                                                    "import_idx",
                                                    Expr::atomic_add(
                                                        out_import_counts,
                                                        Expr::u32(0),
                                                        Expr::u32(GO_SPAN_RECORD_WORDS),
                                                    ),
                                                ),
                                                Node::store(
                                                    out_imports,
                                                    Expr::var("import_idx"),
                                                    token_start(tok_starts, Expr::var("scan")),
                                                ),
                                                Node::store(
                                                    out_imports,
                                                    Expr::add(
                                                        Expr::var("import_idx"),
                                                        Expr::u32(1),
                                                    ),
                                                    token_len(tok_lens, Expr::var("scan")),
                                                ),
                                            ],
                                        ),
                                        Node::if_then(
                                            token_type_eq(tok_types, Expr::var("scan"), TOK_RPAREN),
                                            vec![Node::assign("import_done", Expr::u32(1))],
                                        ),
                                    ],
                                )],
                            ),
                        ],
                    ),
                ],
            )],
        ),
    ];

    Program::wrapped(
        vec![
            BufferDecl::storage(tok_types, 0, BufferAccess::ReadOnly, DataType::U32),
            BufferDecl::storage(tok_starts, 1, BufferAccess::ReadOnly, DataType::U32),
            BufferDecl::storage(tok_lens, 2, BufferAccess::ReadOnly, DataType::U32),
            BufferDecl::storage(haystack, 3, BufferAccess::ReadOnly, DataType::U32),
            BufferDecl::storage(out_packages, 4, BufferAccess::ReadWrite, DataType::U32),
            BufferDecl::storage(
                out_package_counts,
                5,
                BufferAccess::ReadWrite,
                DataType::U32,
            )
            .with_count(1),
            BufferDecl::storage(out_imports, 6, BufferAccess::ReadWrite, DataType::U32),
            BufferDecl::storage(out_import_counts, 7, BufferAccess::ReadWrite, DataType::U32)
                .with_count(1),
        ],
        [256, 1, 1],
        vec![wrap_anonymous(
            "vyre-libs::parsing::go_extract_packages_and_imports",
            vec![Node::if_then(Expr::lt(t, num_tokens), body)],
        )],
    )
    .with_entry_op_id("vyre-libs::parsing::go_extract_packages_and_imports")
    .with_non_composable_with_self(true)
}

/// Extract function, method, and interface declarations.
#[must_use]
#[allow(clippy::too_many_arguments)]
pub fn go_extract_declarations(
    tok_types: &str,
    tok_starts: &str,
    tok_lens: &str,
    haystack: &str,
    num_tokens: Expr,
    out_decls: &str,
    out_decl_counts: &str,
) -> Program {
    let t = Expr::gid_x();
    let body = vec![
        Node::if_then(
            token_is_keyword(
                haystack,
                tok_types,
                tok_starts,
                tok_lens,
                t.clone(),
                b"func",
            ),
            vec![
                Node::let_bind("decl_kind", Expr::u32(GO_DECL_FUNC)),
                Node::let_bind("name_tok", Expr::add(t.clone(), Expr::u32(1))),
                Node::if_then(
                    token_type_eq(tok_types, Expr::var("name_tok"), TOK_LPAREN),
                    vec![
                        Node::assign("decl_kind", Expr::u32(GO_DECL_METHOD)),
                        Node::let_bind("recv_depth", Expr::u32(0)),
                        Node::let_bind("recv_done", Expr::u32(0)),
                        Node::let_bind("recv_end", Expr::var("name_tok")),
                        Node::loop_for(
                            "scan",
                            Expr::var("name_tok"),
                            num_tokens.clone(),
                            vec![Node::if_then(
                                Expr::eq(Expr::var("recv_done"), Expr::u32(0)),
                                vec![
                                    Node::if_then(
                                        token_type_eq(tok_types, Expr::var("scan"), TOK_LPAREN),
                                        vec![Node::assign(
                                            "recv_depth",
                                            Expr::add(Expr::var("recv_depth"), Expr::u32(1)),
                                        )],
                                    ),
                                    Node::if_then(
                                        token_type_eq(tok_types, Expr::var("scan"), TOK_RPAREN),
                                        vec![
                                            Node::assign(
                                                "recv_depth",
                                                Expr::sub(Expr::var("recv_depth"), Expr::u32(1)),
                                            ),
                                            Node::if_then(
                                                Expr::eq(Expr::var("recv_depth"), Expr::u32(0)),
                                                vec![
                                                    Node::assign("recv_done", Expr::u32(1)),
                                                    Node::assign("recv_end", Expr::var("scan")),
                                                ],
                                            ),
                                        ],
                                    ),
                                ],
                            )],
                        ),
                        Node::assign("name_tok", Expr::add(Expr::var("recv_end"), Expr::u32(1))),
                    ],
                ),
                Node::if_then(
                    token_is_ident(tok_types, Expr::var("name_tok")),
                    vec![
                        Node::let_bind("body_start", Expr::u32(0)),
                        Node::let_bind("body_end", Expr::u32(0)),
                        Node::let_bind("brace_depth", Expr::u32(0)),
                        Node::let_bind("brace_done", Expr::u32(0)),
                        Node::loop_for(
                            "scan",
                            Expr::add(Expr::var("name_tok"), Expr::u32(1)),
                            num_tokens.clone(),
                            vec![Node::if_then(
                                Expr::eq(Expr::var("brace_done"), Expr::u32(0)),
                                vec![
                                    Node::if_then(
                                        token_type_eq(tok_types, Expr::var("scan"), TOK_LBRACE),
                                        vec![
                                            Node::if_then(
                                                Expr::eq(Expr::var("brace_depth"), Expr::u32(0)),
                                                vec![Node::assign(
                                                    "body_start",
                                                    token_start(tok_starts, Expr::var("scan")),
                                                )],
                                            ),
                                            Node::assign(
                                                "brace_depth",
                                                Expr::add(Expr::var("brace_depth"), Expr::u32(1)),
                                            ),
                                        ],
                                    ),
                                    Node::if_then(
                                        token_type_eq(tok_types, Expr::var("scan"), TOK_RBRACE),
                                        vec![
                                            Node::assign(
                                                "brace_depth",
                                                Expr::sub(Expr::var("brace_depth"), Expr::u32(1)),
                                            ),
                                            Node::if_then(
                                                Expr::eq(Expr::var("brace_depth"), Expr::u32(0)),
                                                vec![
                                                    Node::assign(
                                                        "body_end",
                                                        Expr::add(
                                                            token_start(
                                                                tok_starts,
                                                                Expr::var("scan"),
                                                            ),
                                                            token_len(tok_lens, Expr::var("scan")),
                                                        ),
                                                    ),
                                                    Node::assign("brace_done", Expr::u32(1)),
                                                ],
                                            ),
                                        ],
                                    ),
                                ],
                            )],
                        ),
                        Node::let_bind(
                            "decl_idx",
                            Expr::atomic_add(
                                out_decl_counts,
                                Expr::u32(0),
                                Expr::u32(GO_DECL_RECORD_WORDS),
                            ),
                        ),
                        Node::store(out_decls, Expr::var("decl_idx"), Expr::var("decl_kind")),
                        Node::store(
                            out_decls,
                            Expr::add(Expr::var("decl_idx"), Expr::u32(1)),
                            token_start(tok_starts, Expr::var("name_tok")),
                        ),
                        Node::store(
                            out_decls,
                            Expr::add(Expr::var("decl_idx"), Expr::u32(2)),
                            token_len(tok_lens, Expr::var("name_tok")),
                        ),
                        Node::store(
                            out_decls,
                            Expr::add(Expr::var("decl_idx"), Expr::u32(3)),
                            Expr::var("body_start"),
                        ),
                        Node::store(
                            out_decls,
                            Expr::add(Expr::var("decl_idx"), Expr::u32(4)),
                            Expr::var("body_end"),
                        ),
                    ],
                ),
            ],
        ),
        Node::if_then(
            Expr::lt(Expr::add(t.clone(), Expr::u32(2)), num_tokens.clone()),
            vec![Node::if_then(
                Expr::and(
                    token_is_keyword(
                        haystack,
                        tok_types,
                        tok_starts,
                        tok_lens,
                        t.clone(),
                        b"type",
                    ),
                    Expr::and(
                        token_is_ident(tok_types, Expr::add(t.clone(), Expr::u32(1))),
                        token_is_keyword(
                            haystack,
                            tok_types,
                            tok_starts,
                            tok_lens,
                            Expr::add(t.clone(), Expr::u32(2)),
                            b"interface",
                        ),
                    ),
                ),
                vec![
                    Node::let_bind("body_start", Expr::u32(0)),
                    Node::let_bind("body_end", Expr::u32(0)),
                    Node::let_bind("brace_depth", Expr::u32(0)),
                    Node::let_bind("brace_done", Expr::u32(0)),
                    Node::loop_for(
                        "scan",
                        Expr::add(t.clone(), Expr::u32(3)),
                        num_tokens.clone(),
                        vec![Node::if_then(
                            Expr::eq(Expr::var("brace_done"), Expr::u32(0)),
                            vec![
                                Node::if_then(
                                    token_type_eq(tok_types, Expr::var("scan"), TOK_LBRACE),
                                    vec![
                                        Node::if_then(
                                            Expr::eq(Expr::var("brace_depth"), Expr::u32(0)),
                                            vec![Node::assign(
                                                "body_start",
                                                token_start(tok_starts, Expr::var("scan")),
                                            )],
                                        ),
                                        Node::assign(
                                            "brace_depth",
                                            Expr::add(Expr::var("brace_depth"), Expr::u32(1)),
                                        ),
                                    ],
                                ),
                                Node::if_then(
                                    token_type_eq(tok_types, Expr::var("scan"), TOK_RBRACE),
                                    vec![
                                        Node::assign(
                                            "brace_depth",
                                            Expr::sub(Expr::var("brace_depth"), Expr::u32(1)),
                                        ),
                                        Node::if_then(
                                            Expr::eq(Expr::var("brace_depth"), Expr::u32(0)),
                                            vec![
                                                Node::assign(
                                                    "body_end",
                                                    Expr::add(
                                                        token_start(tok_starts, Expr::var("scan")),
                                                        token_len(tok_lens, Expr::var("scan")),
                                                    ),
                                                ),
                                                Node::assign("brace_done", Expr::u32(1)),
                                            ],
                                        ),
                                    ],
                                ),
                            ],
                        )],
                    ),
                    Node::let_bind(
                        "decl_idx",
                        Expr::atomic_add(
                            out_decl_counts,
                            Expr::u32(0),
                            Expr::u32(GO_DECL_RECORD_WORDS),
                        ),
                    ),
                    Node::store(
                        out_decls,
                        Expr::var("decl_idx"),
                        Expr::u32(GO_DECL_INTERFACE),
                    ),
                    Node::store(
                        out_decls,
                        Expr::add(Expr::var("decl_idx"), Expr::u32(1)),
                        token_start(tok_starts, Expr::add(t.clone(), Expr::u32(1))),
                    ),
                    Node::store(
                        out_decls,
                        Expr::add(Expr::var("decl_idx"), Expr::u32(2)),
                        token_len(tok_lens, Expr::add(t.clone(), Expr::u32(1))),
                    ),
                    Node::store(
                        out_decls,
                        Expr::add(Expr::var("decl_idx"), Expr::u32(3)),
                        Expr::var("body_start"),
                    ),
                    Node::store(
                        out_decls,
                        Expr::add(Expr::var("decl_idx"), Expr::u32(4)),
                        Expr::var("body_end"),
                    ),
                ],
            )],
        ),
    ];

    Program::wrapped(
        vec![
            BufferDecl::storage(tok_types, 0, BufferAccess::ReadOnly, DataType::U32),
            BufferDecl::storage(tok_starts, 1, BufferAccess::ReadOnly, DataType::U32),
            BufferDecl::storage(tok_lens, 2, BufferAccess::ReadOnly, DataType::U32),
            BufferDecl::storage(haystack, 3, BufferAccess::ReadOnly, DataType::U32),
            BufferDecl::storage(out_decls, 4, BufferAccess::ReadWrite, DataType::U32),
            BufferDecl::storage(out_decl_counts, 5, BufferAccess::ReadWrite, DataType::U32)
                .with_count(1),
        ],
        [256, 1, 1],
        vec![wrap_anonymous(
            "vyre-libs::parsing::go_extract_declarations",
            vec![Node::if_then(Expr::lt(t, num_tokens), body)],
        )],
    )
    .with_entry_op_id("vyre-libs::parsing::go_extract_declarations")
    .with_non_composable_with_self(true)
}