simdref 0.0.1__tar.gz → 0.0.3__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.
Files changed (90) hide show
  1. {simdref-0.0.1/src/simdref.egg-info → simdref-0.0.3}/PKG-INFO +2 -2
  2. {simdref-0.0.1 → simdref-0.0.3}/README.md +1 -1
  3. {simdref-0.0.1 → simdref-0.0.3}/pyproject.toml +1 -1
  4. {simdref-0.0.1 → simdref-0.0.3}/src/simdref/tui.py +61 -21
  5. {simdref-0.0.1 → simdref-0.0.3/src/simdref.egg-info}/PKG-INFO +2 -2
  6. {simdref-0.0.1 → simdref-0.0.3}/LICENSE +0 -0
  7. {simdref-0.0.1 → simdref-0.0.3}/setup.cfg +0 -0
  8. {simdref-0.0.1 → simdref-0.0.3}/src/simdref/__init__.py +0 -0
  9. {simdref-0.0.1 → simdref-0.0.3}/src/simdref/__main__.py +0 -0
  10. {simdref-0.0.1 → simdref-0.0.3}/src/simdref/annotate.py +0 -0
  11. {simdref-0.0.1 → simdref-0.0.3}/src/simdref/arm_instructions.py +0 -0
  12. {simdref-0.0.1 → simdref-0.0.3}/src/simdref/cli.py +0 -0
  13. {simdref-0.0.1 → simdref-0.0.3}/src/simdref/display.py +0 -0
  14. {simdref-0.0.1 → simdref-0.0.3}/src/simdref/filters.py +0 -0
  15. {simdref-0.0.1 → simdref-0.0.3}/src/simdref/ingest.py +0 -0
  16. {simdref-0.0.1 → simdref-0.0.3}/src/simdref/ingest_catalog.py +0 -0
  17. {simdref-0.0.1 → simdref-0.0.3}/src/simdref/ingest_pdf.py +0 -0
  18. {simdref-0.0.1 → simdref-0.0.3}/src/simdref/ingest_sources.py +0 -0
  19. {simdref-0.0.1 → simdref-0.0.3}/src/simdref/lsp.py +0 -0
  20. {simdref-0.0.1 → simdref-0.0.3}/src/simdref/manpages.py +0 -0
  21. {simdref-0.0.1 → simdref-0.0.3}/src/simdref/models.py +0 -0
  22. {simdref-0.0.1 → simdref-0.0.3}/src/simdref/pdfparse/__init__.py +0 -0
  23. {simdref-0.0.1 → simdref-0.0.3}/src/simdref/pdfparse/base.py +0 -0
  24. {simdref-0.0.1 → simdref-0.0.3}/src/simdref/pdfparse/intel.py +0 -0
  25. {simdref-0.0.1 → simdref-0.0.3}/src/simdref/pdfparse/registry.py +0 -0
  26. {simdref-0.0.1 → simdref-0.0.3}/src/simdref/pdfparse/types.py +0 -0
  27. {simdref-0.0.1 → simdref-0.0.3}/src/simdref/pdfrefs.py +0 -0
  28. {simdref-0.0.1 → simdref-0.0.3}/src/simdref/perf.py +0 -0
  29. {simdref-0.0.1 → simdref-0.0.3}/src/simdref/perf_sources/__init__.py +0 -0
  30. {simdref-0.0.1 → simdref-0.0.3}/src/simdref/perf_sources/cores.py +0 -0
  31. {simdref-0.0.1 → simdref-0.0.3}/src/simdref/perf_sources/llvm_mca.py +0 -0
  32. {simdref-0.0.1 → simdref-0.0.3}/src/simdref/perf_sources/llvm_scheduling.py +0 -0
  33. {simdref-0.0.1 → simdref-0.0.3}/src/simdref/perf_sources/merge.py +0 -0
  34. {simdref-0.0.1 → simdref-0.0.3}/src/simdref/profile/__init__.py +0 -0
  35. {simdref-0.0.1 → simdref-0.0.3}/src/simdref/profile/adapters/__init__.py +0 -0
  36. {simdref-0.0.1 → simdref-0.0.3}/src/simdref/profile/adapters/exegesis.py +0 -0
  37. {simdref-0.0.1 → simdref-0.0.3}/src/simdref/profile/adapters/mca.py +0 -0
  38. {simdref-0.0.1 → simdref-0.0.3}/src/simdref/profile/adapters/perf.py +0 -0
  39. {simdref-0.0.1 → simdref-0.0.3}/src/simdref/profile/adapters/uprof.py +0 -0
  40. {simdref-0.0.1 → simdref-0.0.3}/src/simdref/profile/adapters/vtune.py +0 -0
  41. {simdref-0.0.1 → simdref-0.0.3}/src/simdref/profile/adapters/xctrace.py +0 -0
  42. {simdref-0.0.1 → simdref-0.0.3}/src/simdref/profile/hotloop.py +0 -0
  43. {simdref-0.0.1 → simdref-0.0.3}/src/simdref/profile/merge.py +0 -0
  44. {simdref-0.0.1 → simdref-0.0.3}/src/simdref/profile/model.py +0 -0
  45. {simdref-0.0.1 → simdref-0.0.3}/src/simdref/profile/orchestrate.py +0 -0
  46. {simdref-0.0.1 → simdref-0.0.3}/src/simdref/profile/registry.py +0 -0
  47. {simdref-0.0.1 → simdref-0.0.3}/src/simdref/queries.py +0 -0
  48. {simdref-0.0.1 → simdref-0.0.3}/src/simdref/riscv.py +0 -0
  49. {simdref-0.0.1 → simdref-0.0.3}/src/simdref/search.py +0 -0
  50. {simdref-0.0.1 → simdref-0.0.3}/src/simdref/storage.py +0 -0
  51. {simdref-0.0.1 → simdref-0.0.3}/src/simdref/templates/__init__.py +0 -0
  52. {simdref-0.0.1 → simdref-0.0.3}/src/simdref/templates/app.js +0 -0
  53. {simdref-0.0.1 → simdref-0.0.3}/src/simdref/templates/favicon.svg +0 -0
  54. {simdref-0.0.1 → simdref-0.0.3}/src/simdref/templates/index.html +0 -0
  55. {simdref-0.0.1 → simdref-0.0.3}/src/simdref/templates/logo.svg +0 -0
  56. {simdref-0.0.1 → simdref-0.0.3}/src/simdref/templates/style.css +0 -0
  57. {simdref-0.0.1 → simdref-0.0.3}/src/simdref/ui_labels.py +0 -0
  58. {simdref-0.0.1 → simdref-0.0.3}/src/simdref/web.py +0 -0
  59. {simdref-0.0.1 → simdref-0.0.3}/src/simdref.egg-info/SOURCES.txt +0 -0
  60. {simdref-0.0.1 → simdref-0.0.3}/src/simdref.egg-info/dependency_links.txt +0 -0
  61. {simdref-0.0.1 → simdref-0.0.3}/src/simdref.egg-info/entry_points.txt +0 -0
  62. {simdref-0.0.1 → simdref-0.0.3}/src/simdref.egg-info/requires.txt +0 -0
  63. {simdref-0.0.1 → simdref-0.0.3}/src/simdref.egg-info/top_level.txt +0 -0
  64. {simdref-0.0.1 → simdref-0.0.3}/tests/test_annotate.py +0 -0
  65. {simdref-0.0.1 → simdref-0.0.3}/tests/test_audit_coverage.py +0 -0
  66. {simdref-0.0.1 → simdref-0.0.3}/tests/test_cli_bare_query.py +0 -0
  67. {simdref-0.0.1 → simdref-0.0.3}/tests/test_cli_bootstrap_progress.py +0 -0
  68. {simdref-0.0.1 → simdref-0.0.3}/tests/test_cli_help.py +0 -0
  69. {simdref-0.0.1 → simdref-0.0.3}/tests/test_cli_llm.py +0 -0
  70. {simdref-0.0.1 → simdref-0.0.3}/tests/test_coverage_live.py +0 -0
  71. {simdref-0.0.1 → simdref-0.0.3}/tests/test_coverage_parity.py +0 -0
  72. {simdref-0.0.1 → simdref-0.0.3}/tests/test_display.py +0 -0
  73. {simdref-0.0.1 → simdref-0.0.3}/tests/test_filters.py +0 -0
  74. {simdref-0.0.1 → simdref-0.0.3}/tests/test_ingest_sources.py +0 -0
  75. {simdref-0.0.1 → simdref-0.0.3}/tests/test_issue2_fixes.py +0 -0
  76. {simdref-0.0.1 → simdref-0.0.3}/tests/test_lsp_web.py +0 -0
  77. {simdref-0.0.1 → simdref-0.0.3}/tests/test_models.py +0 -0
  78. {simdref-0.0.1 → simdref-0.0.3}/tests/test_pdfparse.py +0 -0
  79. {simdref-0.0.1 → simdref-0.0.3}/tests/test_perf.py +0 -0
  80. {simdref-0.0.1 → simdref-0.0.3}/tests/test_perf_sources.py +0 -0
  81. {simdref-0.0.1 → simdref-0.0.3}/tests/test_presentation.py +0 -0
  82. {simdref-0.0.1 → simdref-0.0.3}/tests/test_preset_persistence.py +0 -0
  83. {simdref-0.0.1 → simdref-0.0.3}/tests/test_search.py +0 -0
  84. {simdref-0.0.1 → simdref-0.0.3}/tests/test_search_pushdown.py +0 -0
  85. {simdref-0.0.1 → simdref-0.0.3}/tests/test_source_kind_filter.py +0 -0
  86. {simdref-0.0.1 → simdref-0.0.3}/tests/test_source_validation.py +0 -0
  87. {simdref-0.0.1 → simdref-0.0.3}/tests/test_storage_schema.py +0 -0
  88. {simdref-0.0.1 → simdref-0.0.3}/tests/test_tui.py +0 -0
  89. {simdref-0.0.1 → simdref-0.0.3}/tests/test_ui_labels_parity.py +0 -0
  90. {simdref-0.0.1 → simdref-0.0.3}/tests/test_x86_linking.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: simdref
3
- Version: 0.0.1
3
+ Version: 0.0.3
4
4
  Summary: Searchable SIMD intrinsic and instruction reference with CLI, manpages, TUI, LSP, and static web export.
5
5
  Author: Marco
6
6
  License: GPL-3.0-or-later
@@ -33,7 +33,7 @@ Dynamic: license-file
33
33
 
34
34
  [![CI](https://github.com/DiamonDinoia/simdref/actions/workflows/ci.yml/badge.svg)](https://github.com/DiamonDinoia/simdref/actions/workflows/ci.yml)
35
35
  [![TestPyPI](https://img.shields.io/pypi/v/simdref?pypiBaseUrl=https%3A%2F%2Ftest.pypi.org&label=TestPyPI)](https://test.pypi.org/project/simdref/)
36
- [![Python](https://img.shields.io/pypi/pyversions/simdref?pypiBaseUrl=https%3A%2F%2Ftest.pypi.org)](https://test.pypi.org/project/simdref/)
36
+ [![Python](https://img.shields.io/pypi/pyversions/simdref?pypiBaseUrl=https%3A%2F%2Ftest.pypi.org)](https://pypi.org/project/simdref/)
37
37
 
38
38
  A single searchable reference for SIMD intrinsics and instructions across
39
39
  **x86 (Intel + uops.info)**, **Arm (ACLE / AARCHMRS)**, and **RISC-V
@@ -2,7 +2,7 @@
2
2
 
3
3
  [![CI](https://github.com/DiamonDinoia/simdref/actions/workflows/ci.yml/badge.svg)](https://github.com/DiamonDinoia/simdref/actions/workflows/ci.yml)
4
4
  [![TestPyPI](https://img.shields.io/pypi/v/simdref?pypiBaseUrl=https%3A%2F%2Ftest.pypi.org&label=TestPyPI)](https://test.pypi.org/project/simdref/)
5
- [![Python](https://img.shields.io/pypi/pyversions/simdref?pypiBaseUrl=https%3A%2F%2Ftest.pypi.org)](https://test.pypi.org/project/simdref/)
5
+ [![Python](https://img.shields.io/pypi/pyversions/simdref?pypiBaseUrl=https%3A%2F%2Ftest.pypi.org)](https://pypi.org/project/simdref/)
6
6
 
7
7
  A single searchable reference for SIMD intrinsics and instructions across
8
8
  **x86 (Intel + uops.info)**, **Arm (ACLE / AARCHMRS)**, and **RISC-V
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "simdref"
7
- version = "0.0.1"
7
+ version = "0.0.3"
8
8
  description = "Searchable SIMD intrinsic and instruction reference with CLI, manpages, TUI, LSP, and static web export."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -191,6 +191,24 @@ def _normalize_sub_isa_selection(
191
191
  # ---------------------------------------------------------------------------
192
192
 
193
193
 
194
+ _MNEMONIC_HINT_TOKENS = frozenset({"add", "sub", "mul", "div", "mov", "cmp", "and", "or", "xor"})
195
+
196
+
197
+ def _classify_query(query: str) -> str:
198
+ """Mirror the web SPA's `classifyQuery` so ranking biases match."""
199
+ lo = query.strip().lower()
200
+ if not lo:
201
+ return "neutral"
202
+ if lo.startswith("_mm") or lo.startswith("__m") or "_mm" in lo:
203
+ return "intrinsic"
204
+ parts = lo.replace("_", " ").split()
205
+ if parts:
206
+ first = parts[0]
207
+ if first in _MNEMONIC_HINT_TOKENS or first.startswith("v"):
208
+ return "instruction"
209
+ return "neutral"
210
+
211
+
194
212
  def _name_match_score(name: str, terms: list[str]) -> int:
195
213
  """Score how well query terms match a name. Higher = better match.
196
214
 
@@ -224,6 +242,7 @@ def _fts_search(
224
242
  enabled_sub_isas: set[str] | None = None,
225
243
  offset: int = 0,
226
244
  limit: int = 30,
245
+ enabled_kinds: set[str] | None = None,
227
246
  ) -> list[SearchResult]:
228
247
  """Search using SQLite FTS5 with ISA family and sub-ISA filtering."""
229
248
  _t_start = time.perf_counter() if _PROFILE else 0.0
@@ -240,17 +259,31 @@ def _fts_search(
240
259
  fts_expr_broad = term_expr
241
260
 
242
261
  # Build an ISA LIKE-clause fragment so SQLite can drop non-matching rows
243
- # before we ever hand them to Python. Sub-ISA tokens (e.g. "SSE2") and
244
- # family names (e.g. "Arm") are substring-matched against the space-joined
245
- # isa column. Families without a sub-ISA breakdown (RISC-V "x86", etc.)
246
- # get their family name added so a plain family-level toggle still matches.
262
+ # before we ever hand them to Python. Sub-ISA tokens (e.g. "SSE2") are
263
+ # substring-matched against the isa column.
264
+ #
265
+ # Families without a sub-ISA breakdown (e.g. "x86", "MMX", "APX", "AVX10",
266
+ # "SVML", "Other") have raw ISA tokens like "I86" or "BMI1" — none of which
267
+ # contain the family-name string. We can't construct a sound LIKE pattern
268
+ # for those, so when any such family is enabled we skip the SQL pushdown
269
+ # entirely and let the Python `_isa_visible` post-filter do the work.
270
+ # Bias scoring by query classification (mirrors the web SPA): a mnemonic
271
+ # query like "add" should rank instructions above intrinsics, while an
272
+ # `_mm…`/`__m…` query should still favour intrinsics. Neutral queries get
273
+ # no kind bias.
274
+ qkind = _classify_query(query)
275
+ if qkind == "instruction":
276
+ intrinsic_bias, instruction_bias, default_kind = -10, 35, "instruction"
277
+ elif qkind == "intrinsic":
278
+ intrinsic_bias, instruction_bias, default_kind = 35, -10, "intrinsic"
279
+ else:
280
+ intrinsic_bias, instruction_bias, default_kind = 0, 0, "intrinsic"
281
+
282
+ has_no_sub_family = bool(enabled_families) and any(
283
+ not FAMILY_SUB_ORDER.get(fam) for fam in enabled_families
284
+ )
247
285
  isa_like_tokens: list[str] = []
248
- if enabled_families:
249
- for fam in enabled_families:
250
- subs = FAMILY_SUB_ORDER.get(fam)
251
- if not subs:
252
- isa_like_tokens.append(fam)
253
- if enabled_sub_isas is not None:
286
+ if not has_no_sub_family and enabled_sub_isas is not None:
254
287
  isa_like_tokens.extend(enabled_sub_isas)
255
288
  # Normalise the isa column the same way _isa_matches_sub does: strip
256
289
  # hyphens so "AVX-512F" matches a pushed-down "AVX512F" pattern. REPLACE
@@ -343,8 +376,10 @@ def _fts_search(
343
376
  # The name-only query uses {name name_tokens} column filter which
344
377
  # requires schema v7+; fall back to broad search on OperationalError.
345
378
  search_exprs = [fts_expr, fts_expr_broad]
379
+ want_intrinsic = enabled_kinds is None or "intrinsic" in enabled_kinds
380
+ want_instruction = enabled_kinds is None or "instruction" in enabled_kinds
346
381
  for expr in search_exprs:
347
- rows = _query_intrinsic_rows(expr)
382
+ rows = _query_intrinsic_rows(expr) if want_intrinsic else []
348
383
  for row in rows:
349
384
  if row["name"] in seen or not _isa_visible(row["isa"] or ""):
350
385
  continue
@@ -359,9 +394,9 @@ def _fts_search(
359
394
  subtitle=subtitle,
360
395
  score=100,
361
396
  )
362
- candidates.append((_name_match_score(row["name"], terms), result))
397
+ candidates.append((_name_match_score(row["name"], terms) + intrinsic_bias, result))
363
398
 
364
- irows = _query_instruction_rows(expr)
399
+ irows = _query_instruction_rows(expr) if want_instruction else []
365
400
  for row in irows:
366
401
  if row["db_key"] in seen or not _isa_visible(row["isa"] or ""):
367
402
  continue
@@ -373,10 +408,17 @@ def _fts_search(
373
408
  subtitle=row["summary"] or "",
374
409
  score=90,
375
410
  )
376
- candidates.append((_name_match_score(row["key"], terms), result))
377
-
378
- # Sort by match score descending, then by kind (intrinsics first)
379
- candidates.sort(key=lambda c: (-c[0], 0 if c[1].kind == "intrinsic" else 1))
411
+ candidates.append((_name_match_score(row["key"], terms) + instruction_bias, result))
412
+
413
+ # Sort by (biased) match score descending. The kind tiebreaker follows the
414
+ # query classification so a mnemonic-like query ("add") doesn't get its
415
+ # instructions buried under intrinsics with identical text scores.
416
+ candidates.sort(
417
+ key=lambda c: (
418
+ -c[0],
419
+ 0 if c[1].kind == default_kind else 1,
420
+ )
421
+ )
380
422
  results = [r for _, r in candidates[offset : offset + limit]]
381
423
  if _PROFILE:
382
424
  _profile_log(
@@ -1456,9 +1498,8 @@ class SimdrefApp(App):
1456
1498
  self._enabled_sub_isas,
1457
1499
  offset=0,
1458
1500
  limit=_INITIAL_RESULT_BATCH,
1501
+ enabled_kinds=set(self._enabled_kinds) if self._enabled_kinds else None,
1459
1502
  )
1460
- if self._enabled_kinds and len(self._enabled_kinds) < 2:
1461
- results = [r for r in results if r.kind in self._enabled_kinds]
1462
1503
  self._current_results = results
1463
1504
  self._has_more_results = len(results) == _INITIAL_RESULT_BATCH
1464
1505
  for i, result in enumerate(results, 1):
@@ -1493,9 +1534,8 @@ class SimdrefApp(App):
1493
1534
  self._enabled_sub_isas,
1494
1535
  offset=len(self._current_results),
1495
1536
  limit=_RESULT_BATCH_SIZE,
1537
+ enabled_kinds=set(self._enabled_kinds) if self._enabled_kinds else None,
1496
1538
  )
1497
- if self._enabled_kinds and len(self._enabled_kinds) < 2:
1498
- more = [r for r in more if r.kind in self._enabled_kinds]
1499
1539
  if not more:
1500
1540
  self._has_more_results = False
1501
1541
  return
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: simdref
3
- Version: 0.0.1
3
+ Version: 0.0.3
4
4
  Summary: Searchable SIMD intrinsic and instruction reference with CLI, manpages, TUI, LSP, and static web export.
5
5
  Author: Marco
6
6
  License: GPL-3.0-or-later
@@ -33,7 +33,7 @@ Dynamic: license-file
33
33
 
34
34
  [![CI](https://github.com/DiamonDinoia/simdref/actions/workflows/ci.yml/badge.svg)](https://github.com/DiamonDinoia/simdref/actions/workflows/ci.yml)
35
35
  [![TestPyPI](https://img.shields.io/pypi/v/simdref?pypiBaseUrl=https%3A%2F%2Ftest.pypi.org&label=TestPyPI)](https://test.pypi.org/project/simdref/)
36
- [![Python](https://img.shields.io/pypi/pyversions/simdref?pypiBaseUrl=https%3A%2F%2Ftest.pypi.org)](https://test.pypi.org/project/simdref/)
36
+ [![Python](https://img.shields.io/pypi/pyversions/simdref?pypiBaseUrl=https%3A%2F%2Ftest.pypi.org)](https://pypi.org/project/simdref/)
37
37
 
38
38
  A single searchable reference for SIMD intrinsics and instructions across
39
39
  **x86 (Intel + uops.info)**, **Arm (ACLE / AARCHMRS)**, and **RISC-V
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes