OR-1 dataflow CPU sketch
1{
2 "$schema": "https://tree-sitter.github.io/tree-sitter/assets/schemas/grammar.schema.json",
3 "name": "dfasm",
4 "word": "identifier",
5 "rules": {
6 "program": {
7 "type": "REPEAT",
8 "content": {
9 "type": "SYMBOL",
10 "name": "_statement"
11 }
12 },
13 "_statement": {
14 "type": "CHOICE",
15 "members": [
16 {
17 "type": "SYMBOL",
18 "name": "func_def"
19 },
20 {
21 "type": "SYMBOL",
22 "name": "inst_def"
23 },
24 {
25 "type": "SYMBOL",
26 "name": "strong_edge"
27 },
28 {
29 "type": "SYMBOL",
30 "name": "weak_edge"
31 },
32 {
33 "type": "SYMBOL",
34 "name": "plain_edge"
35 },
36 {
37 "type": "SYMBOL",
38 "name": "data_def"
39 },
40 {
41 "type": "SYMBOL",
42 "name": "pragma"
43 },
44 {
45 "type": "SYMBOL",
46 "name": "location_dir"
47 }
48 ]
49 },
50 "func_def": {
51 "type": "PREC",
52 "value": 2,
53 "content": {
54 "type": "SEQ",
55 "members": [
56 {
57 "type": "SYMBOL",
58 "name": "func_ref"
59 },
60 {
61 "type": "SYMBOL",
62 "name": "flow_out"
63 },
64 {
65 "type": "STRING",
66 "value": "{"
67 },
68 {
69 "type": "REPEAT",
70 "content": {
71 "type": "SYMBOL",
72 "name": "_statement"
73 }
74 },
75 {
76 "type": "STRING",
77 "value": "}"
78 }
79 ]
80 }
81 },
82 "inst_def": {
83 "type": "PREC",
84 "value": 2,
85 "content": {
86 "type": "SEQ",
87 "members": [
88 {
89 "type": "SYMBOL",
90 "name": "qualified_ref"
91 },
92 {
93 "type": "SYMBOL",
94 "name": "flow_in"
95 },
96 {
97 "type": "SYMBOL",
98 "name": "opcode"
99 },
100 {
101 "type": "REPEAT",
102 "content": {
103 "type": "SEQ",
104 "members": [
105 {
106 "type": "STRING",
107 "value": ","
108 },
109 {
110 "type": "SYMBOL",
111 "name": "_argument"
112 }
113 ]
114 }
115 }
116 ]
117 }
118 },
119 "strong_edge": {
120 "type": "PREC",
121 "value": 2,
122 "content": {
123 "type": "SEQ",
124 "members": [
125 {
126 "type": "SYMBOL",
127 "name": "opcode"
128 },
129 {
130 "type": "SYMBOL",
131 "name": "_argument"
132 },
133 {
134 "type": "REPEAT",
135 "content": {
136 "type": "SEQ",
137 "members": [
138 {
139 "type": "STRING",
140 "value": ","
141 },
142 {
143 "type": "SYMBOL",
144 "name": "_argument"
145 }
146 ]
147 }
148 },
149 {
150 "type": "SYMBOL",
151 "name": "flow_out"
152 },
153 {
154 "type": "SYMBOL",
155 "name": "ref_list"
156 }
157 ]
158 }
159 },
160 "weak_edge": {
161 "type": "PREC",
162 "value": 2,
163 "content": {
164 "type": "SEQ",
165 "members": [
166 {
167 "type": "SYMBOL",
168 "name": "ref_list"
169 },
170 {
171 "type": "SYMBOL",
172 "name": "opcode"
173 },
174 {
175 "type": "SYMBOL",
176 "name": "flow_in"
177 },
178 {
179 "type": "SYMBOL",
180 "name": "_argument"
181 },
182 {
183 "type": "REPEAT",
184 "content": {
185 "type": "SEQ",
186 "members": [
187 {
188 "type": "STRING",
189 "value": ","
190 },
191 {
192 "type": "SYMBOL",
193 "name": "_argument"
194 }
195 ]
196 }
197 }
198 ]
199 }
200 },
201 "plain_edge": {
202 "type": "PREC",
203 "value": 2,
204 "content": {
205 "type": "SEQ",
206 "members": [
207 {
208 "type": "SYMBOL",
209 "name": "qualified_ref"
210 },
211 {
212 "type": "SYMBOL",
213 "name": "flow_out"
214 },
215 {
216 "type": "SYMBOL",
217 "name": "ref_list"
218 }
219 ]
220 }
221 },
222 "data_def": {
223 "type": "PREC",
224 "value": 2,
225 "content": {
226 "type": "SEQ",
227 "members": [
228 {
229 "type": "SYMBOL",
230 "name": "qualified_ref"
231 },
232 {
233 "type": "STRING",
234 "value": "="
235 },
236 {
237 "type": "CHOICE",
238 "members": [
239 {
240 "type": "SYMBOL",
241 "name": "macro_call"
242 },
243 {
244 "type": "SYMBOL",
245 "name": "value_list"
246 }
247 ]
248 }
249 ]
250 }
251 },
252 "pragma": {
253 "type": "PREC",
254 "value": 2,
255 "content": {
256 "type": "SEQ",
257 "members": [
258 {
259 "type": "STRING",
260 "value": "@system"
261 },
262 {
263 "type": "SYMBOL",
264 "name": "system_param"
265 },
266 {
267 "type": "REPEAT",
268 "content": {
269 "type": "SEQ",
270 "members": [
271 {
272 "type": "STRING",
273 "value": ","
274 },
275 {
276 "type": "SYMBOL",
277 "name": "system_param"
278 }
279 ]
280 }
281 }
282 ]
283 }
284 },
285 "system_param": {
286 "type": "SEQ",
287 "members": [
288 {
289 "type": "FIELD",
290 "name": "name",
291 "content": {
292 "type": "SYMBOL",
293 "name": "identifier"
294 }
295 },
296 {
297 "type": "STRING",
298 "value": "="
299 },
300 {
301 "type": "FIELD",
302 "name": "value",
303 "content": {
304 "type": "SYMBOL",
305 "name": "number_literal"
306 }
307 }
308 ]
309 },
310 "location_dir": {
311 "type": "PREC",
312 "value": -1,
313 "content": {
314 "type": "SYMBOL",
315 "name": "qualified_ref"
316 }
317 },
318 "ref_list": {
319 "type": "SEQ",
320 "members": [
321 {
322 "type": "SYMBOL",
323 "name": "qualified_ref"
324 },
325 {
326 "type": "REPEAT",
327 "content": {
328 "type": "SEQ",
329 "members": [
330 {
331 "type": "STRING",
332 "value": ","
333 },
334 {
335 "type": "SYMBOL",
336 "name": "qualified_ref"
337 }
338 ]
339 }
340 }
341 ]
342 },
343 "qualified_ref": {
344 "type": "SEQ",
345 "members": [
346 {
347 "type": "FIELD",
348 "name": "ref",
349 "content": {
350 "type": "CHOICE",
351 "members": [
352 {
353 "type": "SYMBOL",
354 "name": "node_ref"
355 },
356 {
357 "type": "SYMBOL",
358 "name": "label_ref"
359 },
360 {
361 "type": "SYMBOL",
362 "name": "func_ref"
363 }
364 ]
365 }
366 },
367 {
368 "type": "FIELD",
369 "name": "placement",
370 "content": {
371 "type": "CHOICE",
372 "members": [
373 {
374 "type": "SYMBOL",
375 "name": "placement"
376 },
377 {
378 "type": "BLANK"
379 }
380 ]
381 }
382 },
383 {
384 "type": "FIELD",
385 "name": "port",
386 "content": {
387 "type": "CHOICE",
388 "members": [
389 {
390 "type": "SYMBOL",
391 "name": "port"
392 },
393 {
394 "type": "BLANK"
395 }
396 ]
397 }
398 }
399 ]
400 },
401 "node_ref": {
402 "type": "SEQ",
403 "members": [
404 {
405 "type": "STRING",
406 "value": "@"
407 },
408 {
409 "type": "FIELD",
410 "name": "name",
411 "content": {
412 "type": "SYMBOL",
413 "name": "identifier"
414 }
415 }
416 ]
417 },
418 "label_ref": {
419 "type": "SEQ",
420 "members": [
421 {
422 "type": "STRING",
423 "value": "&"
424 },
425 {
426 "type": "FIELD",
427 "name": "name",
428 "content": {
429 "type": "SYMBOL",
430 "name": "identifier"
431 }
432 }
433 ]
434 },
435 "func_ref": {
436 "type": "SEQ",
437 "members": [
438 {
439 "type": "STRING",
440 "value": "$"
441 },
442 {
443 "type": "FIELD",
444 "name": "name",
445 "content": {
446 "type": "SYMBOL",
447 "name": "identifier"
448 }
449 }
450 ]
451 },
452 "placement": {
453 "type": "SEQ",
454 "members": [
455 {
456 "type": "FIELD",
457 "name": "separator",
458 "content": {
459 "type": "IMMEDIATE_TOKEN",
460 "content": {
461 "type": "STRING",
462 "value": "|"
463 }
464 }
465 },
466 {
467 "type": "FIELD",
468 "name": "name",
469 "content": {
470 "type": "SYMBOL",
471 "name": "identifier"
472 }
473 }
474 ]
475 },
476 "port": {
477 "type": "SEQ",
478 "members": [
479 {
480 "type": "FIELD",
481 "name": "separator",
482 "content": {
483 "type": "IMMEDIATE_TOKEN",
484 "content": {
485 "type": "STRING",
486 "value": ":"
487 }
488 }
489 },
490 {
491 "type": "FIELD",
492 "name": "name",
493 "content": {
494 "type": "CHOICE",
495 "members": [
496 {
497 "type": "SYMBOL",
498 "name": "identifier"
499 },
500 {
501 "type": "SYMBOL",
502 "name": "number_literal"
503 }
504 ]
505 }
506 }
507 ]
508 },
509 "_argument": {
510 "type": "CHOICE",
511 "members": [
512 {
513 "type": "SYMBOL",
514 "name": "named_arg"
515 },
516 {
517 "type": "SYMBOL",
518 "name": "_positional_arg"
519 }
520 ]
521 },
522 "named_arg": {
523 "type": "SEQ",
524 "members": [
525 {
526 "type": "FIELD",
527 "name": "key",
528 "content": {
529 "type": "SYMBOL",
530 "name": "identifier"
531 }
532 },
533 {
534 "type": "STRING",
535 "value": "="
536 },
537 {
538 "type": "FIELD",
539 "name": "value",
540 "content": {
541 "type": "SYMBOL",
542 "name": "_positional_arg"
543 }
544 }
545 ]
546 },
547 "_positional_arg": {
548 "type": "CHOICE",
549 "members": [
550 {
551 "type": "SYMBOL",
552 "name": "_value"
553 },
554 {
555 "type": "SYMBOL",
556 "name": "qualified_ref"
557 }
558 ]
559 },
560 "_value": {
561 "type": "CHOICE",
562 "members": [
563 {
564 "type": "SYMBOL",
565 "name": "number_literal"
566 },
567 {
568 "type": "SYMBOL",
569 "name": "char_literal"
570 },
571 {
572 "type": "SYMBOL",
573 "name": "string_literal"
574 },
575 {
576 "type": "SYMBOL",
577 "name": "raw_string_literal"
578 },
579 {
580 "type": "SYMBOL",
581 "name": "byte_string_literal"
582 }
583 ]
584 },
585 "value_list": {
586 "type": "SEQ",
587 "members": [
588 {
589 "type": "SYMBOL",
590 "name": "_value"
591 },
592 {
593 "type": "REPEAT",
594 "content": {
595 "type": "SEQ",
596 "members": [
597 {
598 "type": "STRING",
599 "value": ","
600 },
601 {
602 "type": "SYMBOL",
603 "name": "_value"
604 }
605 ]
606 }
607 }
608 ]
609 },
610 "number_literal": {
611 "type": "CHOICE",
612 "members": [
613 {
614 "type": "SYMBOL",
615 "name": "hex_literal"
616 },
617 {
618 "type": "SYMBOL",
619 "name": "dec_literal"
620 }
621 ]
622 },
623 "hex_literal": {
624 "type": "TOKEN",
625 "content": {
626 "type": "SEQ",
627 "members": [
628 {
629 "type": "STRING",
630 "value": "0x"
631 },
632 {
633 "type": "PATTERN",
634 "value": "[0-9a-fA-F]+"
635 }
636 ]
637 }
638 },
639 "dec_literal": {
640 "type": "PATTERN",
641 "value": "[0-9]+"
642 },
643 "char_literal": {
644 "type": "SEQ",
645 "members": [
646 {
647 "type": "STRING",
648 "value": "'"
649 },
650 {
651 "type": "CHOICE",
652 "members": [
653 {
654 "type": "SYMBOL",
655 "name": "escape_sequence"
656 },
657 {
658 "type": "PATTERN",
659 "value": "[^'\\\\]"
660 }
661 ]
662 },
663 {
664 "type": "STRING",
665 "value": "'"
666 }
667 ]
668 },
669 "string_literal": {
670 "type": "SEQ",
671 "members": [
672 {
673 "type": "STRING",
674 "value": "\""
675 },
676 {
677 "type": "REPEAT",
678 "content": {
679 "type": "CHOICE",
680 "members": [
681 {
682 "type": "SYMBOL",
683 "name": "escape_sequence"
684 },
685 {
686 "type": "PATTERN",
687 "value": "[^\"\\\\]+"
688 }
689 ]
690 }
691 },
692 {
693 "type": "STRING",
694 "value": "\""
695 }
696 ]
697 },
698 "raw_string_literal": {
699 "type": "SEQ",
700 "members": [
701 {
702 "type": "STRING",
703 "value": "r\""
704 },
705 {
706 "type": "PATTERN",
707 "value": "[^\"]*"
708 },
709 {
710 "type": "STRING",
711 "value": "\""
712 }
713 ]
714 },
715 "byte_string_literal": {
716 "type": "SEQ",
717 "members": [
718 {
719 "type": "STRING",
720 "value": "b\""
721 },
722 {
723 "type": "REPEAT",
724 "content": {
725 "type": "CHOICE",
726 "members": [
727 {
728 "type": "SYMBOL",
729 "name": "escape_sequence"
730 },
731 {
732 "type": "PATTERN",
733 "value": "[^\"\\\\]+"
734 }
735 ]
736 }
737 },
738 {
739 "type": "STRING",
740 "value": "\""
741 }
742 ]
743 },
744 "escape_sequence": {
745 "type": "PATTERN",
746 "value": "\\\\([ntr0\\\\'\"]|x[0-9a-fA-F]{2})"
747 },
748 "macro_call": {
749 "type": "PREC_RIGHT",
750 "value": 0,
751 "content": {
752 "type": "SEQ",
753 "members": [
754 {
755 "type": "STRING",
756 "value": "#"
757 },
758 {
759 "type": "FIELD",
760 "name": "name",
761 "content": {
762 "type": "SYMBOL",
763 "name": "identifier"
764 }
765 },
766 {
767 "type": "REPEAT",
768 "content": {
769 "type": "SYMBOL",
770 "name": "_value"
771 }
772 }
773 ]
774 }
775 },
776 "opcode": {
777 "type": "CHOICE",
778 "members": [
779 {
780 "type": "STRING",
781 "value": "add"
782 },
783 {
784 "type": "STRING",
785 "value": "sub"
786 },
787 {
788 "type": "STRING",
789 "value": "inc"
790 },
791 {
792 "type": "STRING",
793 "value": "dec"
794 },
795 {
796 "type": "STRING",
797 "value": "shiftl"
798 },
799 {
800 "type": "STRING",
801 "value": "shiftr"
802 },
803 {
804 "type": "STRING",
805 "value": "ashiftr"
806 },
807 {
808 "type": "STRING",
809 "value": "and"
810 },
811 {
812 "type": "STRING",
813 "value": "or"
814 },
815 {
816 "type": "STRING",
817 "value": "xor"
818 },
819 {
820 "type": "STRING",
821 "value": "not"
822 },
823 {
824 "type": "STRING",
825 "value": "eq"
826 },
827 {
828 "type": "STRING",
829 "value": "lt"
830 },
831 {
832 "type": "STRING",
833 "value": "lte"
834 },
835 {
836 "type": "STRING",
837 "value": "gt"
838 },
839 {
840 "type": "STRING",
841 "value": "gte"
842 },
843 {
844 "type": "STRING",
845 "value": "breq"
846 },
847 {
848 "type": "STRING",
849 "value": "brgt"
850 },
851 {
852 "type": "STRING",
853 "value": "brge"
854 },
855 {
856 "type": "STRING",
857 "value": "brof"
858 },
859 {
860 "type": "STRING",
861 "value": "brty"
862 },
863 {
864 "type": "STRING",
865 "value": "sweq"
866 },
867 {
868 "type": "STRING",
869 "value": "swgt"
870 },
871 {
872 "type": "STRING",
873 "value": "swge"
874 },
875 {
876 "type": "STRING",
877 "value": "swof"
878 },
879 {
880 "type": "STRING",
881 "value": "swty"
882 },
883 {
884 "type": "STRING",
885 "value": "gate"
886 },
887 {
888 "type": "STRING",
889 "value": "sel"
890 },
891 {
892 "type": "STRING",
893 "value": "merge"
894 },
895 {
896 "type": "STRING",
897 "value": "pass"
898 },
899 {
900 "type": "STRING",
901 "value": "const"
902 },
903 {
904 "type": "STRING",
905 "value": "free_ctx"
906 },
907 {
908 "type": "STRING",
909 "value": "change_tag"
910 },
911 {
912 "type": "STRING",
913 "value": "extract_tag"
914 },
915 {
916 "type": "STRING",
917 "value": "read"
918 },
919 {
920 "type": "STRING",
921 "value": "write"
922 },
923 {
924 "type": "STRING",
925 "value": "clear"
926 },
927 {
928 "type": "STRING",
929 "value": "alloc"
930 },
931 {
932 "type": "STRING",
933 "value": "exec"
934 },
935 {
936 "type": "STRING",
937 "value": "free"
938 },
939 {
940 "type": "STRING",
941 "value": "rd_inc"
942 },
943 {
944 "type": "STRING",
945 "value": "rd_dec"
946 },
947 {
948 "type": "STRING",
949 "value": "cmp_sw"
950 },
951 {
952 "type": "STRING",
953 "value": "load_inst"
954 }
955 ]
956 },
957 "flow_in": {
958 "type": "STRING",
959 "value": "<|"
960 },
961 "flow_out": {
962 "type": "STRING",
963 "value": "|>"
964 },
965 "identifier": {
966 "type": "PATTERN",
967 "value": "[a-zA-Z_][a-zA-Z0-9_]*"
968 },
969 "comment": {
970 "type": "TOKEN",
971 "content": {
972 "type": "SEQ",
973 "members": [
974 {
975 "type": "STRING",
976 "value": ";"
977 },
978 {
979 "type": "PATTERN",
980 "value": "[^\\n]*"
981 }
982 ]
983 }
984 }
985 },
986 "extras": [
987 {
988 "type": "PATTERN",
989 "value": "\\s"
990 },
991 {
992 "type": "SYMBOL",
993 "name": "comment"
994 }
995 ],
996 "conflicts": [],
997 "precedences": [],
998 "externals": [],
999 "inline": [],
1000 "supertypes": [],
1001 "reserved": {}
1002}