Repository Analysis

YosysHQ/yosys

Yosys Open SYnthesis Suite

5.8 Low AI signal View on GitHub

Analysis Overview

This report presents the forensic synthetic code analysis of YosysHQ/yosys, a C++ project with 4,641 GitHub stars. SynthScan v2.0 examined 64,238 lines of code across 467 source files, recording 293 pattern matches distributed across 14 syntactic categories. The overall adjusted score of 5.8 places this repository in the Low AI signal band.

The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).

5.8
Adjusted Score
5.8
Raw Score
100%
Time Factor
2026-08-01
Last Push
4.6K
Stars
C++
Language
64.2K
Lines of Code
467
Files
293
Pattern Hits
2026-08-02
Scan Date
0.03
HC Hit Rate

What These Metrics Mean

Adjusted Score
Primary synthetic code indicator. Raw score normalised per 1,000 lines of code and multiplied by the temporal discount factor. This is the definitive comparative metric — use it to rank repositories by AI authorship density.
Raw Score
The unmodified sum of all severity-weighted, context-multiplied pattern match scores before temporal discounting. Reflects the absolute signal strength independent of when the repository was last active.
Time Factor
The temporal discount multiplier (0–100%) applied to the raw score. Repositories last updated before ChatGPT's launch (Nov 2022) receive a 5% factor. Full signal is only assigned to repositories active in the post-adoption era (Jan 2024+).
Pattern Hits
Total count of individual pattern matches across all files and categories. A high hit count with a low score may indicate a very large codebase with isolated AI snippets; a low count with a high score indicates dense, concentrated AI signatures.
HC Hit Rate
High+Critical pattern hits per file, averaged across the repository. This orthogonal signal catches repositories where a few files are densely packed with high-severity AI tells — a strong indicator even when the normalised score appears moderate due to codebase size.
Lines of Code / Files
Total lines and files analysed. The scanner examines 94 file extensions. These denominators are used to normalise the score, enabling fair comparison between repositories of vastly different sizes.

Score History

Longitudinal tracking requires multiple scan runs. Once this repository is re-scanned after new commits land, this chart will visualise how the synthetic code signal evolves over time — enabling you to detect whether AI authorship is growing, stabilising, or being actively corrected by human engineers.

No multi-scan history yet — run the scanner again to build trend data.

Severity Breakdown

Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.

CRITICAL 0HIGH 12MEDIUM 17LOW 264

Directory Score Breakdown

This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.

Pattern Findings

The scanner identified 293 distinct pattern matches across 14 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.

Reading the findings table: The Severity column indicates the diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.

Over-Commented Block159 hits · 152 pts
SeverityFileLineSnippetContext
LOW.pre-commit-config.yaml1# To use:COMMENT
LOWtechlibs/xilinx/cells_xtra.py21 # - UG613 (Spartan 3A)COMMENT
LOWtechlibs/xilinx/cells_xtra.py41 # Cell('RAM16X2S', port_attrs={'WCLK': ['clkbuf_sink']}),COMMENT
LOWtechlibs/xilinx/cells_xtra.py61 # Cell('RAM64X8SW', port_attrs={'WCLK': ['clkbuf_sink']}),COMMENT
LOWtechlibs/xilinx/cells_xtra.py81 # Cell('OR2L'),COMMENT
LOWtechlibs/xilinx/cells_xtra.py201 # Cell('MULT18X18S', port_attrs={'C': ['clkbuf_sink']}), # Spartan 3COMMENT
LOWtechlibs/xilinx/cells_xtra.py381 Cell('BUFMRCE', port_attrs={'O': ['clkbuf_driver']}),COMMENT
LOWtechlibs/lattice/cells_xtra.py21class State(Enum):COMMENT
LOWtechlibs/lattice/cells_xtra.py41 #Cell("FD1P3DX"),COMMENT
LOWtechlibs/lattice/cells_xtra.py61 #Cell("IBPU"),COMMENT
LOWtechlibs/lattice/cells_xtra.py81 #Cell("MUX41"),COMMENT
LOWtechlibs/lattice/cells_xtra.py101 #Cell("OR3"),COMMENT
LOWtechlibs/lattice/cells_xtra.py121 #Cell("XOR3"),COMMENT
LOWtechlibs/lattice/cells_xtra.py181 ]),COMMENT
LOWtechlibs/lattice/cells_xtra.py201 #Cell("FD1P3BX"),COMMENT
LOWtechlibs/lattice/cells_xtra.py221 #Cell("FL1P3IY"),COMMENT
LOWtechlibs/lattice/cells_xtra.py241 #Cell("INV"),COMMENT
LOWtechlibs/lattice/cells_xtra.py261 #Cell("MULT2"),COMMENT
LOWtechlibs/lattice/cells_xtra.py281 #Cell("OFS1P3IX"),COMMENT
LOWtechlibs/lattice/cells_xtra.py301 #Cell("VHI"),COMMENT
LOWtechlibs/lattice/cells_xtra.py321 Cell("PDPW8KC"),COMMENT
LOWtechlibs/lattice/cells_xtra.py341 #Cell("ODDRDQSX1A"),COMMENT
LOWtechlibs/lattice/cells_xtra.py361 ]),COMMENT
LOWtechlibs/lattice/cells_xtra.py381 #Cell("FD1P3BX"),COMMENT
LOWtechlibs/lattice/cells_xtra.py401 #Cell("FL1P3IY"),COMMENT
LOWtechlibs/lattice/cells_xtra.py421 #Cell("INV"),COMMENT
LOWtechlibs/lattice/cells_xtra.py441 #Cell("MULT2"),COMMENT
LOWtechlibs/lattice/cells_xtra.py461 #Cell("OFS1P3IX"),COMMENT
LOWtechlibs/lattice/cells_xtra.py481 #Cell("VHI"),COMMENT
LOWtechlibs/lattice/cells_xtra.py501 Cell("PDPW8KC"),COMMENT
LOWtechlibs/lattice/cells_xtra.py521 #Cell("DQSDLLC"),COMMENT
LOWtechlibs/lattice/cells_xtra.py541 #Cell("AND2"),COMMENT
LOWtechlibs/lattice/cells_xtra.py561 #Cell("FD1P3JX"),COMMENT
LOWtechlibs/lattice/cells_xtra.py581 #Cell("FL1S1AY"),COMMENT
LOWtechlibs/lattice/cells_xtra.py601 #Cell("LB2P3AY"),COMMENT
LOWtechlibs/lattice/cells_xtra.py621 #Cell("MUX321"),COMMENT
LOWtechlibs/lattice/cells_xtra.py641 #Cell("OR2"),COMMENT
LOWtechlibs/lattice/cells_xtra.py661 #Cell("XNOR3"),COMMENT
LOWtechlibs/lattice/cells_xtra.py681 Cell("CLKDIVC"),COMMENT
LOWtechlibs/lattice/cells_xtra.py701 #Cell("DLLDELC"),COMMENT
LOWtechlibs/common/gen_fine_ffs.py1TEMPLATES = [COMMENT
LOWtechlibs/common/gen_fine_ffs.py41 Q <= D;COMMENT
LOWtechlibs/common/gen_fine_ffs.py61output reg Q;COMMENT
LOWtechlibs/common/gen_fine_ffs.py81input D, C, E;COMMENT
LOWtechlibs/common/gen_fine_ffs.py141//-COMMENT
LOWtechlibs/common/gen_fine_ffs.py161endCOMMENT
LOWtechlibs/common/gen_fine_ffs.py221//-COMMENT
LOWtechlibs/common/gen_fine_ffs.py241 else if (S == {S:0|1})COMMENT
LOWtechlibs/common/gen_fine_ffs.py301//-COMMENT
LOWtechlibs/common/gen_fine_ffs.py321 elseCOMMENT
LOWtechlibs/common/gen_fine_ffs.py341input E, D;COMMENT
LOWtechlibs/microchip/LSRAM.txt1# ISC LicenseCOMMENT
LOWtechlibs/microchip/LSRAM.txt21ram block $__LSRAM_TDP_ {COMMENT
LOWtechlibs/microchip/uSRAM.txt1# ISC LicenseCOMMENT
LOWtechlibs/gatemate/make_lut_tree_lib.py101def NOT(arg): return FNode("NOT", arg)COMMENT
LOWtechlibs/gatemate/make_lut_tree_lib.py141# ["$__CC3_AAA", AND(AND(A,B),AND(A,C))],COMMENT
LOWfrontends/verilog/verilog_lexer.h1#ifndef VERILOG_LEXER_HCOMMENT
LOWbackends/smt2/smtbmc.py1#!@PYTHON_SHEBANG@COMMENT
LOWbackends/smt2/witness.py1#!@PYTHON_SHEBANG@COMMENT
LOWbackends/smt2/smtio.py1#COMMENT
99 more matches not shown…
Cross-Language Confusion12 hits · 55 pts
SeverityFileLineSnippetContext
HIGHbackends/smt2/smtbmc_incremental.py177 smt_out.push({"and": "true", "or": "false"}[expr[0]])CODE
HIGHpasses/pmgen/pmgen.py434 print(" if (cell != nullptr && blacklist_cells.insert(cell).second) {", file=f)CODE
HIGHpasses/pmgen/pmgen.py438 print(" if (rollback == 0 || rollback > rb)", file=f)CODE
HIGHpasses/pmgen/pmgen.py786 print(" if (generate_mode && rng(100) < (found_any_match ? {} : {})) {{".format(block["genargs"][1], CODE
HIGHtests/gen_tests_makefile.py55 cmd = f"bash -v {sh_file} >{sh_file}.err 2>&1 && mv {sh_file}.err {sh_file}.log"CODE
HIGHtests/memlib/generate_mk.py443 if (we && ra == wa)CODE
HIGHtests/memlib/generate_mk.py937 if (we && be[i])CODE
HIGHtests/memlib/generate_mk.py1439 ("grden", "rden && rst", "old", False, 1), # selects _clken, simulates _rdenSTRING
HIGHtests/memlib/generate_mk.py1440 ("grden_ce", "rden && rst", "old", True, 4), # both of the aboveSTRING
HIGHtests/memlib/generate_mk.py1484 ("rdenrst_wr_byte", "rden && rst", ["USE_SRST"], "old", 3),CODE
HIGHtests/memfile/generate_mk.py9 setup = "mkdir -p temp && cp content1.dat temp/content2.dat"CODE
HIGHtests/fsm/generate_mk.py54 print(' assign rst = rst1 || rst2;')CODE
Deep Nesting54 hits · 54 pts
SeverityFileLineSnippetContext
LOWtechlibs/fix_mod.py6CODE
LOWtechlibs/xilinx/cells_xtra.py607CODE
LOW…hlibs/quicklogic/qlf_k6n10f/generate_bram_types_sim.py3CODE
LOWtechlibs/lattice/cells_xtra.py719CODE
LOWtechlibs/lattice/cells_xtra_nexus.py175CODE
LOWtechlibs/gowin/cells_xtra.py38CODE
LOWbackends/edif/runtest.py11CODE
LOWbackends/smt2/smtbmc.py730CODE
LOWbackends/smt2/smtbmc.py829CODE
LOWbackends/smt2/smtbmc.py973CODE
LOWbackends/smt2/smtbmc.py1082CODE
LOWbackends/smt2/smtbmc.py1166CODE
LOWbackends/smt2/smtbmc.py1316CODE
LOWbackends/smt2/smtbmc.py1386CODE
LOWbackends/smt2/smtbmc.py1684CODE
LOWbackends/smt2/smtbmc.py1715CODE
LOWbackends/smt2/smtbmc_incremental.py374CODE
LOWbackends/smt2/witness.py187CODE
LOWbackends/smt2/witness.py365CODE
LOWbackends/smt2/witness.py337CODE
LOWbackends/smt2/smtio.py345CODE
LOWbackends/smt2/smtio.py458CODE
LOWbackends/smt2/smtio.py557CODE
LOWbackends/smt2/smtio.py819CODE
LOWbackends/smt2/smtio.py1195CODE
LOWbackends/smt2/smtio.py1311CODE
LOWpasses/pmgen/pmgen.py50CODE
LOWpasses/pmgen/pmgen.py110CODE
LOWtests/tools/txt2tikztiming.py33CODE
LOWtests/bram/generate_mk.py14CODE
LOWtests/xprop/test.py59CODE
LOWtests/arch/generate_mk.py16CODE
LOWtests/arch/gatemate/gen_luttrees.py3CODE
LOWtests/rpc/frontend.py66CODE
LOWtests/functional/rkt_vcd.py13CODE
LOWtests/functional/rkt_vcd.py47CODE
LOWtests/functional/smtio.py321CODE
LOWtests/functional/smtio.py434CODE
LOWtests/functional/smtio.py533CODE
LOWtests/functional/smtio.py795CODE
LOWtests/functional/smtio.py1163CODE
LOWtests/functional/smtio.py1269CODE
LOWtests/functional/smt_vcd.py42CODE
LOWtests/functional/smt_vcd.py15CODE
LOWtests/functional/smt_vcd.py47CODE
LOWtests/functional/smt_vcd.py143CODE
LOWtests/functional/rtlil_cells.py369CODE
LOWdocs/util/custom_directives.py68CODE
LOWdocs/util/cmd_documenter.py351CODE
LOWdocs/util/cmd_documenter.py365CODE
LOWpyosys/generator.py295CODE
LOWpyosys/generator.py327CODE
LOWpyosys/generator.py510CODE
LOWpyosys/generator.py647CODE
Decorative Section Separators9 hits · 32 pts
SeverityFileLineSnippetContext
MEDIUMtests/simple/generate_mk.py8# ----------------------COMMENT
MEDIUMtests/simple/generate_mk.py10# ----------------------COMMENT
MEDIUMtests/arch/analogdevices/mem_gen.py6blockram_template = """# ======================================CODE
MEDIUMtests/arch/quicklogic/qlf_k6n10f/mem_gen.py6blockram_template = """# ======================================CODE
MEDIUMtests/rpc/frontend.py30# ----------------------------------------------------------------------------STRING
MEDIUMtests/simple_abc9/generate_mk.py10# ----------------------COMMENT
MEDIUMtests/simple_abc9/generate_mk.py12# ----------------------COMMENT
MEDIUMtests/simple_abc9/generate_mk.py18# ----------------------COMMENT
MEDIUMtests/simple_abc9/generate_mk.py20# ----------------------COMMENT
Unused Imports22 hits · 22 pts
SeverityFileLineSnippetContext
LOWtechlibs/gowin/cells_xtra.py8CODE
LOWtechlibs/gowin/cells_xtra.py9CODE
LOWbackends/smt2/smtbmc.py20CODE
LOWbackends/smt2/smtio.py24CODE
LOWtests/tools/txt2tikztiming.py5CODE
LOWtests/svinterfaces/generate_mk.py3CODE
LOWtests/arch/analogdevices/generate_mk.py7CODE
LOWtests/arch/analogdevices/mem_gen.py1CODE
LOWtests/arch/quicklogic/qlf_k6n10f/generate_mk.py7CODE
LOWtests/arch/quicklogic/qlf_k6n10f/mem_gen.py1CODE
LOWtests/functional/rkt_vcd.py1CODE
LOWtests/functional/smtio.py24CODE
LOWtests/functional/smt_vcd.py1CODE
LOWtests/functional/smt_vcd.py2CODE
LOWtests/functional/smt_vcd.py3CODE
LOWtests/functional/rtlil_cells.py2CODE
LOWdocs/util/cell_documenter.py2CODE
LOWdocs/util/custom_directives.py3CODE
LOWdocs/util/cmd_documenter.py2CODE
LOWdocs/util/cmd_documenter.py4CODE
LOWexamples/python-api/script.py6CODE
LOWkernel/cellhelp.py3CODE
AI Slop Vocabulary5 hits · 15 pts
SeverityFileLineSnippetContext
MEDIUMlibs/minisat/Vec.h81 // happen given the way capacities are calculated (below). Essentially, all capacities areCOMMENT
MEDIUMpyosys/hashlib.h281 // repr(set(s)) where s is iterable would be more terse/robustCOMMENT
MEDIUMpyosys/hashlib.h408 // repr(dict(s)) where s is iterable would be more terse/robustCOMMENT
MEDIUMpyosys/hashlib.h512 // repr(dict(s)) where s is iterable would be more terse/robustCOMMENT
MEDIUMkernel/drivertools.h1118 // Essentially a dict<DriveBitId, pool<DriveBitId>> but using less memoryCOMMENT
Excessive Try-Catch Wrapping7 hits · 10 pts
SeverityFileLineSnippetContext
LOWbackends/smt2/smtbmc_incremental.py612 except Exception as e:CODE
MEDIUMtests/simple/generate_mk.py12 print("Error: Icarus Verilog 'iverilog' not found.", file=sys.stderr)CODE
LOWtests/memories/validate.py86 except Exception as e:CODE
LOWtests/memories/validate.py92 except Exception as e:CODE
MEDIUMtests/simple_abc9/generate_mk.py14 print("Error: Icarus Verilog 'iverilog' not found.", file=sys.stderr)CODE
LOWdocs/util/cell_documenter.py221 except Exception as exc:STRING
LOWdocs/util/cmd_documenter.py263 except Exception as exc:STRING
Hyper-Verbose Identifiers12 hits · 10 pts
SeverityFileLineSnippetContext
LOWbackends/smt2/smtbmc.py1490def print_failed_asserts_worker(mod, state, path, extrainfo, infomap, infokey=()):STRING
LOWbackends/smt2/smtbmc.py1628def smt_assert_design_assumes(step):STRING
LOWbackends/smt2/smtbmc.py1802def report_tracked_assumptions(msg):STRING
LOWbackends/smt2/smtbmc_incremental.py427 def cmd_assert_design_assumes(self, cmd):CODE
LOWbackends/smt2/smtbmc_incremental.py447 def cmd_get_unsat_assumptions(self, cmd):CODE
LOWbackends/smt2/smtio.py985 def get_raw_unsat_assumptions(self):CODE
LOWtests/functional/test_smtbmc_witness_mismatch.py76def assert_no_mismatch_message(result):CODE
LOWtests/functional/test_smtbmc_witness_mismatch.py82def assert_has_mismatch_message(result, msg):CODE
LOWtests/functional/test_smtbmc_witness_mismatch.py143def test_allowed_extra_signal_in_design(tmp_path):STRING
LOWtests/functional/test_smtbmc_witness_mismatch.py169def test_allowed_extra_memory_in_design(tmp_path):STRING
LOWtests/functional/smtio.py961 def get_raw_unsat_assumptions(self):CODE
LOWpyosys/generator.py378 def make_preprocessor_options(self, build_dir):CODE
Example Usage Blocks3 hits · 4 pts
SeverityFileLineSnippetContext
LOWtests/vloghtb/common.sh13 # Usage:COMMENT
LOWtests/vloghtb/common.sh40 # Usage:COMMENT
LOWtests/vloghtb/common.sh74 # Usage:COMMENT
Redundant / Tautological Comments2 hits · 4 pts
SeverityFileLineSnippetContext
LOWtests/simple/generate_mk.py9# Check if iverilog is installedCOMMENT
LOWtests/simple_abc9/generate_mk.py11# Check if iverilog is installedCOMMENT
Modern Structural Boilerplate4 hits · 4 pts
SeverityFileLineSnippetContext
LOWdocs/util/cell_documenter.py15logger = logging.getLogger(__name__)CODE
LOWdocs/util/RtlilLexer.py4__all__ = ['RtlilLexer']CODE
LOWdocs/util/cmd_documenter.py15logger = logging.getLogger(__name__)CODE
LOWpyosys/modinit.py19__all__ = ["libyosys"]CODE
Self-Referential Comments1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUMtests/functional/smt_vcd.py136 # Create a single assertion covering all timestepsCOMMENT
Slop Phrases2 hits · 3 pts
SeverityFileLineSnippetContext
LOW.github/workflows/test-compile.yml50 # newest, make sure to update maximum standard step to matchCOMMENT
LOW.github/actions/setup-build-env/action.yml32 # if updating common/build/docs dependencies, make sure to update README.mdCOMMENT
AI Structural Patterns1 hit · 1 pts
SeverityFileLineSnippetContext
LOWdocs/util/cmd_documenter.py61CODE