simdref 0.0.10__tar.gz → 0.0.11__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- simdref-0.0.11/PKG-INFO +208 -0
- simdref-0.0.11/README.md +174 -0
- {simdref-0.0.10 → simdref-0.0.11}/pyproject.toml +1 -1
- {simdref-0.0.10 → simdref-0.0.11}/src/simdref/lsp.py +29 -6
- simdref-0.0.11/src/simdref.egg-info/PKG-INFO +208 -0
- {simdref-0.0.10 → simdref-0.0.11}/tests/test_lsp_stdio.py +27 -0
- simdref-0.0.10/PKG-INFO +0 -251
- simdref-0.0.10/README.md +0 -217
- simdref-0.0.10/src/simdref.egg-info/PKG-INFO +0 -251
- {simdref-0.0.10 → simdref-0.0.11}/LICENSE +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/setup.cfg +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/src/simdref/__init__.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/src/simdref/__main__.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/src/simdref/annotate.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/src/simdref/arm_instructions.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/src/simdref/cli.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/src/simdref/display.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/src/simdref/export.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/src/simdref/filters.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/src/simdref/ingest.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/src/simdref/ingest_catalog.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/src/simdref/ingest_pdf.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/src/simdref/ingest_sources.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/src/simdref/manpages.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/src/simdref/models.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/src/simdref/pdfparse/__init__.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/src/simdref/pdfparse/base.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/src/simdref/pdfparse/intel.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/src/simdref/pdfparse/registry.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/src/simdref/pdfparse/types.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/src/simdref/pdfrefs.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/src/simdref/perf.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/src/simdref/perf_sources/__init__.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/src/simdref/perf_sources/cores.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/src/simdref/perf_sources/llvm_mca.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/src/simdref/perf_sources/llvm_scheduling.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/src/simdref/perf_sources/merge.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/src/simdref/queries.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/src/simdref/riscv.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/src/simdref/search.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/src/simdref/storage.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/src/simdref/tui.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/src/simdref/ui_labels.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/src/simdref.egg-info/SOURCES.txt +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/src/simdref.egg-info/dependency_links.txt +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/src/simdref.egg-info/entry_points.txt +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/src/simdref.egg-info/requires.txt +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/src/simdref.egg-info/top_level.txt +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/tests/test_annotate.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/tests/test_annotate_positions.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/tests/test_audit_coverage.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/tests/test_auto_update_on_version_change.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/tests/test_cli_bare_query.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/tests/test_cli_bootstrap_progress.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/tests/test_cli_help.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/tests/test_cli_llm.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/tests/test_coverage_live.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/tests/test_coverage_parity.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/tests/test_display.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/tests/test_export.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/tests/test_filters.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/tests/test_ingest_sources.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/tests/test_intel_operation_and_url.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/tests/test_issue2_fixes.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/tests/test_issues_23_24_25.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/tests/test_lsp_web.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/tests/test_models.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/tests/test_pdfparse.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/tests/test_perf.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/tests/test_perf_sources.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/tests/test_presentation.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/tests/test_preset_persistence.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/tests/test_riscv_docs_pages.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/tests/test_search.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/tests/test_search_pushdown.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/tests/test_source_kind_filter.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/tests/test_source_validation.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/tests/test_storage_payload.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/tests/test_storage_schema.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/tests/test_tui.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/tests/test_ui_labels_parity.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/tests/test_version_matches_pyproject.py +0 -0
- {simdref-0.0.10 → simdref-0.0.11}/tests/test_x86_linking.py +0 -0
simdref-0.0.11/PKG-INFO
ADDED
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: simdref
|
|
3
|
+
Version: 0.0.11
|
|
4
|
+
Summary: Searchable SIMD intrinsic and instruction reference with CLI, manpages, TUI, and LSP.
|
|
5
|
+
Author: Marco
|
|
6
|
+
License: GPL-3.0-or-later
|
|
7
|
+
Classifier: Development Status :: 3 - Alpha
|
|
8
|
+
Classifier: Environment :: Console
|
|
9
|
+
Classifier: Intended Audience :: Developers
|
|
10
|
+
Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)
|
|
11
|
+
Classifier: Operating System :: OS Independent
|
|
12
|
+
Classifier: Programming Language :: Python :: 3
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
18
|
+
Classifier: Topic :: Software Development :: Documentation
|
|
19
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
20
|
+
Requires-Python: >=3.10
|
|
21
|
+
Description-Content-Type: text/markdown
|
|
22
|
+
License-File: LICENSE
|
|
23
|
+
Requires-Dist: click<9,>=8.5
|
|
24
|
+
Requires-Dist: httpx<1,>=0.28
|
|
25
|
+
Requires-Dist: msgpack<2,>=1.2.1
|
|
26
|
+
Requires-Dist: pdfplumber<1,>=0.11.10
|
|
27
|
+
Requires-Dist: PyMuPDF<2,>=1.28
|
|
28
|
+
Requires-Dist: PyYAML<7,>=6.0.3
|
|
29
|
+
Requires-Dist: rapidfuzz<4,>=3.14
|
|
30
|
+
Requires-Dist: rich<16,>=15
|
|
31
|
+
Requires-Dist: textual<9,>=8.2
|
|
32
|
+
Requires-Dist: typer<1,>=0.27
|
|
33
|
+
Dynamic: license-file
|
|
34
|
+
|
|
35
|
+
# simdref
|
|
36
|
+
|
|
37
|
+
[](https://github.com/simd-labs/simdref/actions/workflows/ci.yml)
|
|
38
|
+
[](https://test.pypi.org/project/simdref/)
|
|
39
|
+
[](https://pypi.org/project/simdref/)
|
|
40
|
+
|
|
41
|
+
simdref is a SIMD intrinsic and instruction reference for x86 (Intel +
|
|
42
|
+
uops.info), Arm (ACLE, AARCHMRS), and RISC-V (RVV + unified-db). It runs as
|
|
43
|
+
a CLI, a TUI, an LSP server, and an on-demand manpage renderer.
|
|
44
|
+
|
|
45
|
+
[Web app](https://simdref.diamondinoia.com/) ·
|
|
46
|
+
[TestPyPI](https://test.pypi.org/project/simdref/) ·
|
|
47
|
+
[GitHub](https://github.com/simd-labs/simdref) ·
|
|
48
|
+
[Contributing](CONTRIBUTING.md)
|
|
49
|
+
|
|
50
|
+
<p align="center">
|
|
51
|
+
<img alt="simdref TUI" src="https://raw.githubusercontent.com/simd-labs/simdref/refs/assets/docs/img/tui.svg" width="720">
|
|
52
|
+
</p>
|
|
53
|
+
|
|
54
|
+
## Install the Claude Code and Codex skill
|
|
55
|
+
|
|
56
|
+
The `asm-analysis` skill lives in
|
|
57
|
+
[simd-labs/simdref-skill](https://github.com/simd-labs/simdref-skill). Follow
|
|
58
|
+
the install steps in that repo.
|
|
59
|
+
|
|
60
|
+
## Install
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
pip install simdref
|
|
64
|
+
isa update # download the pre-built catalog
|
|
65
|
+
isa doctor # check the install
|
|
66
|
+
isa # open the TUI
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
The package installs two equivalent executables, `isa` and `simdref`. The
|
|
70
|
+
catalog download does not need `llvm-mca`. Only `isa build` needs
|
|
71
|
+
`llvm-mca` 18+ on `PATH`.
|
|
72
|
+
|
|
73
|
+
Pre-release builds live on TestPyPI:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
pip install -i https://test.pypi.org/simple/ \
|
|
77
|
+
--extra-index-url https://pypi.org/simple/ simdref
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## Quickstart
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
isa _mm_add_ps # exact intrinsic -> detailed view
|
|
84
|
+
isa VPADDD # exact instruction -> detailed view
|
|
85
|
+
isa _mm_add # fuzzy -> ranked search results
|
|
86
|
+
isa mm add # tokenized query -> intrinsic-biased search
|
|
87
|
+
isa ADD # mnemonic-like -> instruction-biased search
|
|
88
|
+
isa VADDPS 2 # pick variant #2 from the last result list
|
|
89
|
+
isa # open the TUI
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## Interfaces
|
|
93
|
+
|
|
94
|
+
The web app at [simdref.diamondinoia.com](https://simdref.diamondinoia.com/)
|
|
95
|
+
reads the JSON site data this repo exports:
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
isa export --out-dir ./site-data
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
The LSP server speaks JSON-RPC over stdio:
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
simdref-lsp
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Editor clients, one for each editor:
|
|
108
|
+
|
|
109
|
+
- Zed: [zed-simdref](https://github.com/simd-labs/zed-simdref)
|
|
110
|
+
- VS Code: [vscode-simdref](https://github.com/simd-labs/vscode-simdref)
|
|
111
|
+
- JetBrains: [jetbrains-simdref](https://github.com/simd-labs/jetbrains-simdref)
|
|
112
|
+
- Neovim: [nvim-simdref](https://github.com/simd-labs/nvim-simdref)
|
|
113
|
+
|
|
114
|
+
Each client shows a one-line brief at the end of each instruction line and
|
|
115
|
+
the full manpage on hover, from the local catalog.
|
|
116
|
+
|
|
117
|
+
The LLM interface emits JSON and NDJSON with exit codes 0 (match), 1 (bad
|
|
118
|
+
flag), 2 (no match), 3 (ambiguous):
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
isa llm query _mm_add_ps --source-kind measured
|
|
122
|
+
echo -e "_mm_add_ps\nVPADDD" | isa llm batch
|
|
123
|
+
isa llm list --pattern "*gather*" --isa Intel
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
See [docs/LLM.md](docs/LLM.md) for the payload shape.
|
|
127
|
+
|
|
128
|
+
The annotator turns compiler `.s` output into an annotated `.sa` file.
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
isa annotate hello_simd.s # writes hello_simd.sa
|
|
132
|
+
isa annotate hello_simd.s --arch skylake-x -o - # stdout, skylake-x only
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
The annotator adds a trailing comment with the summary, latency, and CPI to
|
|
136
|
+
each instruction line. The output stays valid assembly.
|
|
137
|
+
|
|
138
|
+
## Commands
|
|
139
|
+
|
|
140
|
+
`isa --help` groups commands into Commands and Dev commands.
|
|
141
|
+
|
|
142
|
+
Commands
|
|
143
|
+
|
|
144
|
+
| Command | Description |
|
|
145
|
+
| ----------------------- | ------------------------------------------------------------------------- |
|
|
146
|
+
| `isa` | Open the TUI |
|
|
147
|
+
| `isa <query>` | Open the TUI with the query in a TTY, else print ranked results to stdout |
|
|
148
|
+
| `isa doctor` | Check the install, non-zero exit on failure |
|
|
149
|
+
| `isa update` | Download the pre-built catalog, `--from-release` for the GitHub Release |
|
|
150
|
+
| `isa annotate <file.s>` | Annotate a `.s` file with summaries and latency/CPI, writes `<file>.sa` |
|
|
151
|
+
| `isa man <name>` | Show a manpage, rendered on demand |
|
|
152
|
+
| `isa install-manpages` | Pre-generate man7 pages so plain `man vpaddd` works |
|
|
153
|
+
| `isa llm query <q>` | Strict lookup to JSON, NDJSON, or Markdown |
|
|
154
|
+
| `isa llm batch` | Resolve many queries from stdin in one invocation |
|
|
155
|
+
| `isa llm list` | Emit the FilterSpec or stream matching catalog entries |
|
|
156
|
+
| `isa llm schema` | Print the JSON schema for `llm` payloads |
|
|
157
|
+
|
|
158
|
+
Dev commands
|
|
159
|
+
|
|
160
|
+
| Command | Description |
|
|
161
|
+
| -------------------------------- | ------------------------------------------------------- |
|
|
162
|
+
| `isa build` | Rebuild the catalog from upstream, needs `llvm-mca` 18+ |
|
|
163
|
+
| `isa export` | Export the site-data JSON for the `simdref-web` repo |
|
|
164
|
+
| `isa completion install [SHELL]` | Install shell completion into the user profile |
|
|
165
|
+
| `isa completion show [SHELL]` | Print the completion script |
|
|
166
|
+
|
|
167
|
+
## Data sources
|
|
168
|
+
|
|
169
|
+
| Source | What | Entries¹ |
|
|
170
|
+
| ----------------------- | ------------------------------------------------------- | ------------------ |
|
|
171
|
+
| Intel Intrinsics Guide | Signatures, descriptions, ISA, categories | 7,381 intrinsics |
|
|
172
|
+
| uops.info | Instructions, operands, latency, throughput, ports | 2,558 instructions |
|
|
173
|
+
| Arm ACLE (NEON, SVE) | Intrinsic signatures and descriptions | 10,791 intrinsics |
|
|
174
|
+
| Arm AARCHMRS (A64) | Base instruction forms and operand tables | live-only² |
|
|
175
|
+
| riscv-rvv-intrinsic-doc | RVV intrinsics with deterministic instruction refs | 74,289 intrinsics |
|
|
176
|
+
| RISC-V unified-db | RVV instruction forms, ISA tags, description, operation | 672 instructions |
|
|
177
|
+
|
|
178
|
+
¹ Counts from the vendored snapshot. See
|
|
179
|
+
[`docs/coverage/summary.json`](docs/coverage/summary.json) for parity
|
|
180
|
+
against upstream and [`docs/SOURCES.md`](docs/SOURCES.md) for licenses.
|
|
181
|
+
|
|
182
|
+
² The full AARCHMRS A64 spec needs a live fetch or a tarball under
|
|
183
|
+
`vendor/arm/`.
|
|
184
|
+
|
|
185
|
+
Each perf row carries a `(measured, <core>)` or `(modeled, <core>)` tag.
|
|
186
|
+
|
|
187
|
+
### Scope
|
|
188
|
+
|
|
189
|
+
- Performance data is x86-only.
|
|
190
|
+
- RISC-V coverage is RVV only, not scalar or privileged ISA.
|
|
191
|
+
|
|
192
|
+
## Development
|
|
193
|
+
|
|
194
|
+
```bash
|
|
195
|
+
git clone https://github.com/simd-labs/simdref.git
|
|
196
|
+
cd simdref
|
|
197
|
+
python3 -m venv .venv
|
|
198
|
+
.venv/bin/pip install -e .
|
|
199
|
+
.venv/bin/isa build # needs llvm-mca 18+
|
|
200
|
+
.venv/bin/python -m pytest tests/ -v
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md) and
|
|
204
|
+
[ARCHITECTURE.md](ARCHITECTURE.md).
|
|
205
|
+
|
|
206
|
+
## License
|
|
207
|
+
|
|
208
|
+
[GNU General Public License v3.0](LICENSE).
|
simdref-0.0.11/README.md
ADDED
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
# simdref
|
|
2
|
+
|
|
3
|
+
[](https://github.com/simd-labs/simdref/actions/workflows/ci.yml)
|
|
4
|
+
[](https://test.pypi.org/project/simdref/)
|
|
5
|
+
[](https://pypi.org/project/simdref/)
|
|
6
|
+
|
|
7
|
+
simdref is a SIMD intrinsic and instruction reference for x86 (Intel +
|
|
8
|
+
uops.info), Arm (ACLE, AARCHMRS), and RISC-V (RVV + unified-db). It runs as
|
|
9
|
+
a CLI, a TUI, an LSP server, and an on-demand manpage renderer.
|
|
10
|
+
|
|
11
|
+
[Web app](https://simdref.diamondinoia.com/) ·
|
|
12
|
+
[TestPyPI](https://test.pypi.org/project/simdref/) ·
|
|
13
|
+
[GitHub](https://github.com/simd-labs/simdref) ·
|
|
14
|
+
[Contributing](CONTRIBUTING.md)
|
|
15
|
+
|
|
16
|
+
<p align="center">
|
|
17
|
+
<img alt="simdref TUI" src="https://raw.githubusercontent.com/simd-labs/simdref/refs/assets/docs/img/tui.svg" width="720">
|
|
18
|
+
</p>
|
|
19
|
+
|
|
20
|
+
## Install the Claude Code and Codex skill
|
|
21
|
+
|
|
22
|
+
The `asm-analysis` skill lives in
|
|
23
|
+
[simd-labs/simdref-skill](https://github.com/simd-labs/simdref-skill). Follow
|
|
24
|
+
the install steps in that repo.
|
|
25
|
+
|
|
26
|
+
## Install
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
pip install simdref
|
|
30
|
+
isa update # download the pre-built catalog
|
|
31
|
+
isa doctor # check the install
|
|
32
|
+
isa # open the TUI
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
The package installs two equivalent executables, `isa` and `simdref`. The
|
|
36
|
+
catalog download does not need `llvm-mca`. Only `isa build` needs
|
|
37
|
+
`llvm-mca` 18+ on `PATH`.
|
|
38
|
+
|
|
39
|
+
Pre-release builds live on TestPyPI:
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
pip install -i https://test.pypi.org/simple/ \
|
|
43
|
+
--extra-index-url https://pypi.org/simple/ simdref
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Quickstart
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
isa _mm_add_ps # exact intrinsic -> detailed view
|
|
50
|
+
isa VPADDD # exact instruction -> detailed view
|
|
51
|
+
isa _mm_add # fuzzy -> ranked search results
|
|
52
|
+
isa mm add # tokenized query -> intrinsic-biased search
|
|
53
|
+
isa ADD # mnemonic-like -> instruction-biased search
|
|
54
|
+
isa VADDPS 2 # pick variant #2 from the last result list
|
|
55
|
+
isa # open the TUI
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Interfaces
|
|
59
|
+
|
|
60
|
+
The web app at [simdref.diamondinoia.com](https://simdref.diamondinoia.com/)
|
|
61
|
+
reads the JSON site data this repo exports:
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
isa export --out-dir ./site-data
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
The LSP server speaks JSON-RPC over stdio:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
simdref-lsp
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Editor clients, one for each editor:
|
|
74
|
+
|
|
75
|
+
- Zed: [zed-simdref](https://github.com/simd-labs/zed-simdref)
|
|
76
|
+
- VS Code: [vscode-simdref](https://github.com/simd-labs/vscode-simdref)
|
|
77
|
+
- JetBrains: [jetbrains-simdref](https://github.com/simd-labs/jetbrains-simdref)
|
|
78
|
+
- Neovim: [nvim-simdref](https://github.com/simd-labs/nvim-simdref)
|
|
79
|
+
|
|
80
|
+
Each client shows a one-line brief at the end of each instruction line and
|
|
81
|
+
the full manpage on hover, from the local catalog.
|
|
82
|
+
|
|
83
|
+
The LLM interface emits JSON and NDJSON with exit codes 0 (match), 1 (bad
|
|
84
|
+
flag), 2 (no match), 3 (ambiguous):
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
isa llm query _mm_add_ps --source-kind measured
|
|
88
|
+
echo -e "_mm_add_ps\nVPADDD" | isa llm batch
|
|
89
|
+
isa llm list --pattern "*gather*" --isa Intel
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
See [docs/LLM.md](docs/LLM.md) for the payload shape.
|
|
93
|
+
|
|
94
|
+
The annotator turns compiler `.s` output into an annotated `.sa` file.
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
isa annotate hello_simd.s # writes hello_simd.sa
|
|
98
|
+
isa annotate hello_simd.s --arch skylake-x -o - # stdout, skylake-x only
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
The annotator adds a trailing comment with the summary, latency, and CPI to
|
|
102
|
+
each instruction line. The output stays valid assembly.
|
|
103
|
+
|
|
104
|
+
## Commands
|
|
105
|
+
|
|
106
|
+
`isa --help` groups commands into Commands and Dev commands.
|
|
107
|
+
|
|
108
|
+
Commands
|
|
109
|
+
|
|
110
|
+
| Command | Description |
|
|
111
|
+
| ----------------------- | ------------------------------------------------------------------------- |
|
|
112
|
+
| `isa` | Open the TUI |
|
|
113
|
+
| `isa <query>` | Open the TUI with the query in a TTY, else print ranked results to stdout |
|
|
114
|
+
| `isa doctor` | Check the install, non-zero exit on failure |
|
|
115
|
+
| `isa update` | Download the pre-built catalog, `--from-release` for the GitHub Release |
|
|
116
|
+
| `isa annotate <file.s>` | Annotate a `.s` file with summaries and latency/CPI, writes `<file>.sa` |
|
|
117
|
+
| `isa man <name>` | Show a manpage, rendered on demand |
|
|
118
|
+
| `isa install-manpages` | Pre-generate man7 pages so plain `man vpaddd` works |
|
|
119
|
+
| `isa llm query <q>` | Strict lookup to JSON, NDJSON, or Markdown |
|
|
120
|
+
| `isa llm batch` | Resolve many queries from stdin in one invocation |
|
|
121
|
+
| `isa llm list` | Emit the FilterSpec or stream matching catalog entries |
|
|
122
|
+
| `isa llm schema` | Print the JSON schema for `llm` payloads |
|
|
123
|
+
|
|
124
|
+
Dev commands
|
|
125
|
+
|
|
126
|
+
| Command | Description |
|
|
127
|
+
| -------------------------------- | ------------------------------------------------------- |
|
|
128
|
+
| `isa build` | Rebuild the catalog from upstream, needs `llvm-mca` 18+ |
|
|
129
|
+
| `isa export` | Export the site-data JSON for the `simdref-web` repo |
|
|
130
|
+
| `isa completion install [SHELL]` | Install shell completion into the user profile |
|
|
131
|
+
| `isa completion show [SHELL]` | Print the completion script |
|
|
132
|
+
|
|
133
|
+
## Data sources
|
|
134
|
+
|
|
135
|
+
| Source | What | Entries¹ |
|
|
136
|
+
| ----------------------- | ------------------------------------------------------- | ------------------ |
|
|
137
|
+
| Intel Intrinsics Guide | Signatures, descriptions, ISA, categories | 7,381 intrinsics |
|
|
138
|
+
| uops.info | Instructions, operands, latency, throughput, ports | 2,558 instructions |
|
|
139
|
+
| Arm ACLE (NEON, SVE) | Intrinsic signatures and descriptions | 10,791 intrinsics |
|
|
140
|
+
| Arm AARCHMRS (A64) | Base instruction forms and operand tables | live-only² |
|
|
141
|
+
| riscv-rvv-intrinsic-doc | RVV intrinsics with deterministic instruction refs | 74,289 intrinsics |
|
|
142
|
+
| RISC-V unified-db | RVV instruction forms, ISA tags, description, operation | 672 instructions |
|
|
143
|
+
|
|
144
|
+
¹ Counts from the vendored snapshot. See
|
|
145
|
+
[`docs/coverage/summary.json`](docs/coverage/summary.json) for parity
|
|
146
|
+
against upstream and [`docs/SOURCES.md`](docs/SOURCES.md) for licenses.
|
|
147
|
+
|
|
148
|
+
² The full AARCHMRS A64 spec needs a live fetch or a tarball under
|
|
149
|
+
`vendor/arm/`.
|
|
150
|
+
|
|
151
|
+
Each perf row carries a `(measured, <core>)` or `(modeled, <core>)` tag.
|
|
152
|
+
|
|
153
|
+
### Scope
|
|
154
|
+
|
|
155
|
+
- Performance data is x86-only.
|
|
156
|
+
- RISC-V coverage is RVV only, not scalar or privileged ISA.
|
|
157
|
+
|
|
158
|
+
## Development
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
git clone https://github.com/simd-labs/simdref.git
|
|
162
|
+
cd simdref
|
|
163
|
+
python3 -m venv .venv
|
|
164
|
+
.venv/bin/pip install -e .
|
|
165
|
+
.venv/bin/isa build # needs llvm-mca 18+
|
|
166
|
+
.venv/bin/python -m pytest tests/ -v
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md) and
|
|
170
|
+
[ARCHITECTURE.md](ARCHITECTURE.md).
|
|
171
|
+
|
|
172
|
+
## License
|
|
173
|
+
|
|
174
|
+
[GNU General Public License v3.0](LICENSE).
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "simdref"
|
|
7
|
-
version = "0.0.
|
|
7
|
+
version = "0.0.11"
|
|
8
8
|
description = "Searchable SIMD intrinsic and instruction reference with CLI, manpages, TUI, and LSP."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -83,17 +83,27 @@ def _word_at(text: str, line: int, character: int) -> str | None:
|
|
|
83
83
|
if line >= len(lines):
|
|
84
84
|
return None
|
|
85
85
|
current = lines[line]
|
|
86
|
+
character = _code_point_index(current, character)
|
|
86
87
|
for match in WORD_RE.finditer(current):
|
|
87
88
|
if match.start() <= character <= match.end():
|
|
88
89
|
return match.group(0)
|
|
89
90
|
return None
|
|
90
91
|
|
|
91
92
|
|
|
93
|
+
def _code_point_index(line: str, character: int) -> int:
|
|
94
|
+
# LSP columns count UTF-16 code units; Python indexes code points.
|
|
95
|
+
units, index = 0, 0
|
|
96
|
+
while index < len(line) and units < character:
|
|
97
|
+
units += 2 if ord(line[index]) > 0xFFFF else 1
|
|
98
|
+
index += 1
|
|
99
|
+
return index
|
|
100
|
+
|
|
101
|
+
|
|
92
102
|
def _line_prefix(text: str, line: int, character: int) -> str:
|
|
93
103
|
lines = text.splitlines()
|
|
94
104
|
if line >= len(lines):
|
|
95
105
|
return ""
|
|
96
|
-
current = lines[line][:character]
|
|
106
|
+
current = lines[line][: _code_point_index(lines[line], character)]
|
|
97
107
|
match = re.search(WORD_RE.pattern + r"$", current)
|
|
98
108
|
return match.group(0) if match else ""
|
|
99
109
|
|
|
@@ -267,7 +277,9 @@ def _asm_literals(text: str) -> list[tuple[int, str]]:
|
|
|
267
277
|
|
|
268
278
|
|
|
269
279
|
def _in_asm_string(text: str, line: int, character: int) -> bool:
|
|
270
|
-
offset = sum(len(item) + 1 for item in text.split("\n")[:line]) +
|
|
280
|
+
offset = sum(len(item) + 1 for item in text.split("\n")[:line]) + _code_point_index(
|
|
281
|
+
text.split("\n")[line], character
|
|
282
|
+
)
|
|
271
283
|
return any(start <= offset <= start + len(body) for start, body in _asm_literals(text))
|
|
272
284
|
|
|
273
285
|
|
|
@@ -442,16 +454,27 @@ def main() -> int:
|
|
|
442
454
|
operand_count = None
|
|
443
455
|
operand_text = ""
|
|
444
456
|
if word and allow_instruction:
|
|
445
|
-
offset = sum(len(item) + 1 for item in text.split("\n")[:line]) +
|
|
457
|
+
offset = sum(len(item) + 1 for item in text.split("\n")[:line]) + _code_point_index(
|
|
458
|
+
text.split("\n")[line], character
|
|
459
|
+
)
|
|
446
460
|
language_id = session.languages.get(uri, "")
|
|
447
461
|
segment = _asm_line_at(text, language_id, uri, offset)
|
|
448
462
|
if segment:
|
|
449
463
|
operand_text = segment
|
|
464
|
+
# The C-escape pair "\t" starts a segment in asm("...\n\t...").
|
|
465
|
+
# Strip the backslash so the mnemonic survives.
|
|
450
466
|
parsed = _mnemonic_from_asm_line(
|
|
451
|
-
segment, _semicolon_is_comment(language_id, uri)
|
|
467
|
+
segment.lstrip("\\"), _semicolon_is_comment(language_id, uri)
|
|
452
468
|
)
|
|
453
|
-
if parsed
|
|
454
|
-
|
|
469
|
+
if parsed:
|
|
470
|
+
if parsed[0].casefold() == word.casefold():
|
|
471
|
+
operand_count = parsed[1]
|
|
472
|
+
elif word.casefold().endswith(parsed[0].casefold()):
|
|
473
|
+
# The raw word can swallow a preceding escape character:
|
|
474
|
+
# on "\tvmulps" _word_at reads "tvmulps", but the parsed
|
|
475
|
+
# segment names the real mnemonic.
|
|
476
|
+
word = parsed[0]
|
|
477
|
+
operand_count = parsed[1]
|
|
455
478
|
body = (
|
|
456
479
|
_hover_markdown(
|
|
457
480
|
conn,
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: simdref
|
|
3
|
+
Version: 0.0.11
|
|
4
|
+
Summary: Searchable SIMD intrinsic and instruction reference with CLI, manpages, TUI, and LSP.
|
|
5
|
+
Author: Marco
|
|
6
|
+
License: GPL-3.0-or-later
|
|
7
|
+
Classifier: Development Status :: 3 - Alpha
|
|
8
|
+
Classifier: Environment :: Console
|
|
9
|
+
Classifier: Intended Audience :: Developers
|
|
10
|
+
Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)
|
|
11
|
+
Classifier: Operating System :: OS Independent
|
|
12
|
+
Classifier: Programming Language :: Python :: 3
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
18
|
+
Classifier: Topic :: Software Development :: Documentation
|
|
19
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
20
|
+
Requires-Python: >=3.10
|
|
21
|
+
Description-Content-Type: text/markdown
|
|
22
|
+
License-File: LICENSE
|
|
23
|
+
Requires-Dist: click<9,>=8.5
|
|
24
|
+
Requires-Dist: httpx<1,>=0.28
|
|
25
|
+
Requires-Dist: msgpack<2,>=1.2.1
|
|
26
|
+
Requires-Dist: pdfplumber<1,>=0.11.10
|
|
27
|
+
Requires-Dist: PyMuPDF<2,>=1.28
|
|
28
|
+
Requires-Dist: PyYAML<7,>=6.0.3
|
|
29
|
+
Requires-Dist: rapidfuzz<4,>=3.14
|
|
30
|
+
Requires-Dist: rich<16,>=15
|
|
31
|
+
Requires-Dist: textual<9,>=8.2
|
|
32
|
+
Requires-Dist: typer<1,>=0.27
|
|
33
|
+
Dynamic: license-file
|
|
34
|
+
|
|
35
|
+
# simdref
|
|
36
|
+
|
|
37
|
+
[](https://github.com/simd-labs/simdref/actions/workflows/ci.yml)
|
|
38
|
+
[](https://test.pypi.org/project/simdref/)
|
|
39
|
+
[](https://pypi.org/project/simdref/)
|
|
40
|
+
|
|
41
|
+
simdref is a SIMD intrinsic and instruction reference for x86 (Intel +
|
|
42
|
+
uops.info), Arm (ACLE, AARCHMRS), and RISC-V (RVV + unified-db). It runs as
|
|
43
|
+
a CLI, a TUI, an LSP server, and an on-demand manpage renderer.
|
|
44
|
+
|
|
45
|
+
[Web app](https://simdref.diamondinoia.com/) ·
|
|
46
|
+
[TestPyPI](https://test.pypi.org/project/simdref/) ·
|
|
47
|
+
[GitHub](https://github.com/simd-labs/simdref) ·
|
|
48
|
+
[Contributing](CONTRIBUTING.md)
|
|
49
|
+
|
|
50
|
+
<p align="center">
|
|
51
|
+
<img alt="simdref TUI" src="https://raw.githubusercontent.com/simd-labs/simdref/refs/assets/docs/img/tui.svg" width="720">
|
|
52
|
+
</p>
|
|
53
|
+
|
|
54
|
+
## Install the Claude Code and Codex skill
|
|
55
|
+
|
|
56
|
+
The `asm-analysis` skill lives in
|
|
57
|
+
[simd-labs/simdref-skill](https://github.com/simd-labs/simdref-skill). Follow
|
|
58
|
+
the install steps in that repo.
|
|
59
|
+
|
|
60
|
+
## Install
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
pip install simdref
|
|
64
|
+
isa update # download the pre-built catalog
|
|
65
|
+
isa doctor # check the install
|
|
66
|
+
isa # open the TUI
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
The package installs two equivalent executables, `isa` and `simdref`. The
|
|
70
|
+
catalog download does not need `llvm-mca`. Only `isa build` needs
|
|
71
|
+
`llvm-mca` 18+ on `PATH`.
|
|
72
|
+
|
|
73
|
+
Pre-release builds live on TestPyPI:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
pip install -i https://test.pypi.org/simple/ \
|
|
77
|
+
--extra-index-url https://pypi.org/simple/ simdref
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## Quickstart
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
isa _mm_add_ps # exact intrinsic -> detailed view
|
|
84
|
+
isa VPADDD # exact instruction -> detailed view
|
|
85
|
+
isa _mm_add # fuzzy -> ranked search results
|
|
86
|
+
isa mm add # tokenized query -> intrinsic-biased search
|
|
87
|
+
isa ADD # mnemonic-like -> instruction-biased search
|
|
88
|
+
isa VADDPS 2 # pick variant #2 from the last result list
|
|
89
|
+
isa # open the TUI
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## Interfaces
|
|
93
|
+
|
|
94
|
+
The web app at [simdref.diamondinoia.com](https://simdref.diamondinoia.com/)
|
|
95
|
+
reads the JSON site data this repo exports:
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
isa export --out-dir ./site-data
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
The LSP server speaks JSON-RPC over stdio:
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
simdref-lsp
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Editor clients, one for each editor:
|
|
108
|
+
|
|
109
|
+
- Zed: [zed-simdref](https://github.com/simd-labs/zed-simdref)
|
|
110
|
+
- VS Code: [vscode-simdref](https://github.com/simd-labs/vscode-simdref)
|
|
111
|
+
- JetBrains: [jetbrains-simdref](https://github.com/simd-labs/jetbrains-simdref)
|
|
112
|
+
- Neovim: [nvim-simdref](https://github.com/simd-labs/nvim-simdref)
|
|
113
|
+
|
|
114
|
+
Each client shows a one-line brief at the end of each instruction line and
|
|
115
|
+
the full manpage on hover, from the local catalog.
|
|
116
|
+
|
|
117
|
+
The LLM interface emits JSON and NDJSON with exit codes 0 (match), 1 (bad
|
|
118
|
+
flag), 2 (no match), 3 (ambiguous):
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
isa llm query _mm_add_ps --source-kind measured
|
|
122
|
+
echo -e "_mm_add_ps\nVPADDD" | isa llm batch
|
|
123
|
+
isa llm list --pattern "*gather*" --isa Intel
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
See [docs/LLM.md](docs/LLM.md) for the payload shape.
|
|
127
|
+
|
|
128
|
+
The annotator turns compiler `.s` output into an annotated `.sa` file.
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
isa annotate hello_simd.s # writes hello_simd.sa
|
|
132
|
+
isa annotate hello_simd.s --arch skylake-x -o - # stdout, skylake-x only
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
The annotator adds a trailing comment with the summary, latency, and CPI to
|
|
136
|
+
each instruction line. The output stays valid assembly.
|
|
137
|
+
|
|
138
|
+
## Commands
|
|
139
|
+
|
|
140
|
+
`isa --help` groups commands into Commands and Dev commands.
|
|
141
|
+
|
|
142
|
+
Commands
|
|
143
|
+
|
|
144
|
+
| Command | Description |
|
|
145
|
+
| ----------------------- | ------------------------------------------------------------------------- |
|
|
146
|
+
| `isa` | Open the TUI |
|
|
147
|
+
| `isa <query>` | Open the TUI with the query in a TTY, else print ranked results to stdout |
|
|
148
|
+
| `isa doctor` | Check the install, non-zero exit on failure |
|
|
149
|
+
| `isa update` | Download the pre-built catalog, `--from-release` for the GitHub Release |
|
|
150
|
+
| `isa annotate <file.s>` | Annotate a `.s` file with summaries and latency/CPI, writes `<file>.sa` |
|
|
151
|
+
| `isa man <name>` | Show a manpage, rendered on demand |
|
|
152
|
+
| `isa install-manpages` | Pre-generate man7 pages so plain `man vpaddd` works |
|
|
153
|
+
| `isa llm query <q>` | Strict lookup to JSON, NDJSON, or Markdown |
|
|
154
|
+
| `isa llm batch` | Resolve many queries from stdin in one invocation |
|
|
155
|
+
| `isa llm list` | Emit the FilterSpec or stream matching catalog entries |
|
|
156
|
+
| `isa llm schema` | Print the JSON schema for `llm` payloads |
|
|
157
|
+
|
|
158
|
+
Dev commands
|
|
159
|
+
|
|
160
|
+
| Command | Description |
|
|
161
|
+
| -------------------------------- | ------------------------------------------------------- |
|
|
162
|
+
| `isa build` | Rebuild the catalog from upstream, needs `llvm-mca` 18+ |
|
|
163
|
+
| `isa export` | Export the site-data JSON for the `simdref-web` repo |
|
|
164
|
+
| `isa completion install [SHELL]` | Install shell completion into the user profile |
|
|
165
|
+
| `isa completion show [SHELL]` | Print the completion script |
|
|
166
|
+
|
|
167
|
+
## Data sources
|
|
168
|
+
|
|
169
|
+
| Source | What | Entries¹ |
|
|
170
|
+
| ----------------------- | ------------------------------------------------------- | ------------------ |
|
|
171
|
+
| Intel Intrinsics Guide | Signatures, descriptions, ISA, categories | 7,381 intrinsics |
|
|
172
|
+
| uops.info | Instructions, operands, latency, throughput, ports | 2,558 instructions |
|
|
173
|
+
| Arm ACLE (NEON, SVE) | Intrinsic signatures and descriptions | 10,791 intrinsics |
|
|
174
|
+
| Arm AARCHMRS (A64) | Base instruction forms and operand tables | live-only² |
|
|
175
|
+
| riscv-rvv-intrinsic-doc | RVV intrinsics with deterministic instruction refs | 74,289 intrinsics |
|
|
176
|
+
| RISC-V unified-db | RVV instruction forms, ISA tags, description, operation | 672 instructions |
|
|
177
|
+
|
|
178
|
+
¹ Counts from the vendored snapshot. See
|
|
179
|
+
[`docs/coverage/summary.json`](docs/coverage/summary.json) for parity
|
|
180
|
+
against upstream and [`docs/SOURCES.md`](docs/SOURCES.md) for licenses.
|
|
181
|
+
|
|
182
|
+
² The full AARCHMRS A64 spec needs a live fetch or a tarball under
|
|
183
|
+
`vendor/arm/`.
|
|
184
|
+
|
|
185
|
+
Each perf row carries a `(measured, <core>)` or `(modeled, <core>)` tag.
|
|
186
|
+
|
|
187
|
+
### Scope
|
|
188
|
+
|
|
189
|
+
- Performance data is x86-only.
|
|
190
|
+
- RISC-V coverage is RVV only, not scalar or privileged ISA.
|
|
191
|
+
|
|
192
|
+
## Development
|
|
193
|
+
|
|
194
|
+
```bash
|
|
195
|
+
git clone https://github.com/simd-labs/simdref.git
|
|
196
|
+
cd simdref
|
|
197
|
+
python3 -m venv .venv
|
|
198
|
+
.venv/bin/pip install -e .
|
|
199
|
+
.venv/bin/isa build # needs llvm-mca 18+
|
|
200
|
+
.venv/bin/python -m pytest tests/ -v
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md) and
|
|
204
|
+
[ARCHITECTURE.md](ARCHITECTURE.md).
|
|
205
|
+
|
|
206
|
+
## License
|
|
207
|
+
|
|
208
|
+
[GNU General Public License v3.0](LICENSE).
|