lvkit 0.7.0__tar.gz → 0.7.2__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.
- {lvkit-0.7.0 → lvkit-0.7.2}/PKG-INFO +1 -1
- {lvkit-0.7.0 → lvkit-0.7.2}/editors/vscode/README.md +10 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/pyproject.toml +1 -1
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/__init__.py +1 -1
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/cli.py +175 -6
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/graph/describe.py +43 -61
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/graph/netlist.py +10 -2
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/graph/op_walk.py +4 -4
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/skill_templates/lvkit-convert/SKILL.md +3 -2
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/skill_templates/lvkit-describe/SKILL.md +5 -3
- {lvkit-0.7.0 → lvkit-0.7.2}/.gitignore +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/.pre-commit-config.yaml +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/LICENSE +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/NOTICE +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/README.md +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/deploy/cloudrun/README.md +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/docs/_internal/xml-schema/README.md +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/editors/vscode/LICENSE +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/mcpb/README.md +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/plugin/README.md +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/scripts/audit_primitive_consistency.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/scripts/audit_terminal_order.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/scripts/audit_unresolved.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/scripts/build_example_pages.sh +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/scripts/build_hero.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/scripts/build_ni_function_catalog.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/scripts/connector_geometry_audit.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/scripts/dump_primitive_context.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/scripts/extract_corpus.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/scripts/gen_semantics_probe.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/scripts/generate_docs.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/scripts/generate_driver_data.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/scripts/generate_python.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/scripts/list_unknown_primitives.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/scripts/populate_vilib.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/scripts/pull_samples.sh +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/scripts/recategorize_vilib.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/scripts/render_gallery.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/scripts/reproduce_openg_corpus.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/scripts/study_unwired_direction.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/scripts/wire_decode_probe.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/__main__.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/_data.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/_pylabview_patches.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/cache_paths.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/README.md +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/__init__.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/ast_optimizer.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/ast_utils.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/builder.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/class_builder.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/condition_builder.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/context.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/dataflow.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/elementwise.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/error_handler.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/expressions.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/fragment.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/function.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/imports.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/nodes/__init__.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/nodes/base.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/nodes/case.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/nodes/compound.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/nodes/constant.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/nodes/event.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/nodes/first_call.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/nodes/formula.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/nodes/in_place.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/nodes/invoke_node.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/nodes/loop.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/nodes/nmux.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/nodes/primitive.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/nodes/printf.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/nodes/property_node.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/nodes/queue_ops.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/nodes/sequence.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/nodes/subvi.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/stubs.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/codegen/unresolved.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/connector_geometry.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/connector_pane_geometry.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/connector_pane_patterns.json +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/drivers/_index.json +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/drivers/daqmx.json +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/drivers/nidcpower.json +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/drivers/nidigital.json +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/drivers/nidmm.json +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/drivers/nifgen.json +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/drivers/niscope.json +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/drivers/niswitch.json +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/drivers/serial.json +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/drivers/visa.json +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/labview_error_codes.json +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/measure_data.json +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/openg/_index.json +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/openg/array.json +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/openg/file.json +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/openg/string.json +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/openg/time.json +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/openg/variant.json +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/primitives.json +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/vilib/_index.json +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/vilib/_pending_terminals.json +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/vilib/_types.json +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/vilib/addons.json +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/vilib/application-control.json +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/vilib/array.json +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/vilib/boolean.json +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/vilib/cluster-class-variant.json +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/vilib/collection.json +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/vilib/comparison.json +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/vilib/connectivity.json +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/vilib/control-simulation.json +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/vilib/data-communication.json +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/vilib/dialog-user-interface.json +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/vilib/express.json +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/vilib/file-io.json +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/vilib/graphics-sound.json +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/vilib/instrument-io.json +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/vilib/mathematics.json +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/vilib/measurement-io.json +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/vilib/numeric.json +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/vilib/report-generation.json +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/vilib/signal-processing.json +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/vilib/string.json +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/vilib/structures.json +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/vilib/synchronization.json +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/vilib/timing.json +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/data/vilib/waveform.json +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/docs/__init__.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/docs/generate.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/docs/html_generator.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/docs/template.css +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/docs/utils.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/extractor.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/flattened_typedesc.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/formula/__init__.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/formula/cparser.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/formula/emit.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/formula/lexer.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/formula/nodes.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/graph/__init__.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/graph/analysis.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/graph/builders/__init__.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/graph/builders/context.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/graph/builders/operations.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/graph/builders/refs.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/graph/builders/structures.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/graph/construction.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/graph/core.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/graph/diff.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/graph/interface_order.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/graph/loading.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/graph/models.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/graph/operations.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/graph/parallel_parse.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/graph/queries.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/index/__init__.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/index/build.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/index/model.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/index/project.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/index/query.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/index/sql.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/index/store.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/labview_error.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/labview_error_codes.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/labview_queue.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/load_mode.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/lv_detect.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/mcp/__init__.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/mcp/schemas.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/mcp/server.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/measure_data.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/models.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/num_format.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/output_cache.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/parser/__init__.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/parser/conp_types.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/parser/constants.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/parser/defaults.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/parser/flags.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/parser/fp_heap_type.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/parser/front_panel.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/parser/layout.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/parser/metadata.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/parser/models.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/parser/naming.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/parser/node_types.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/parser/nodes/__init__.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/parser/nodes/base.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/parser/nodes/case.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/parser/nodes/constant.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/parser/nodes/decompose.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/parser/nodes/disable.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/parser/nodes/event.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/parser/nodes/free_label.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/parser/nodes/loop.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/parser/nodes/sequence.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/parser/type_mapping.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/parser/type_resolution.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/parser/utils.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/parser/vi.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/parser/wire_table.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/pipeline.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/primitive_resolver.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/project_store.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/py.typed +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/ARCHITECTURE.md +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/__init__.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/backend.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/composite.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/connector_pane.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/connector_pane_panel.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/diff_viewer.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/draw.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyph.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/__init__.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/decorations/__init__.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/decorations/arrow.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/decorations/base.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/decorations/factory.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/decorations/fallback.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/decorations/frame.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/decorations/line.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/__init__.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/arith.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/array_build.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/array_reverse.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/array_search.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/array_size.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/array_sort.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/array_split.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/base.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/boolean_constant.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/boolean_gate.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/bundle.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/bundle_by_name.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/centered_svg.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/cluster_constant.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/compound_arith.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/constant.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/control_ref_const.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/convert.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/error_cluster.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/event_data.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/formula_node.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/icon_image.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/in_place_element.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/inline_svg.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/invoke_node.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/label.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/local_variable.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/property_node.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/unbundle.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/variant.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/nodes/wrapped_box.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/structures/__init__.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/structures/base.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/structures/case.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/structures/disable.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/structures/event.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/structures/factory.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/structures/flat_sequence.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/structures/for_loop.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/structures/generic.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/structures/in_place.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/structures/selectable.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/structures/stacked_sequence.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/structures/while_loop.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/terminals/__init__.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/terminals/autoindex.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/terminals/base.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/terminals/concatenate.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/terminals/conditional.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/terminals/event_dyn.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/terminals/event_timeout.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/terminals/factory.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/terminals/generic.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/terminals/loop_count.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/terminals/selector.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/terminals/shift_register.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/glyphs/terminals/tunnel.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/help_tip.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/icons.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/lane_pass.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/nodes.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/properties_panel.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/render_viewer.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/scene.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/style.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/templates/diff_viewer.html +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/templates/render_viewer.html +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/theme_control.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/theme_web.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/render/wire_router.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/runtime/__init__.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/runtime/lv.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/skill_templates/__init__.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/skill_templates/lvkit/SKILL.md +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/skill_templates/lvkit-document/SKILL.md +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/skill_templates/lvkit-query/SKILL.md +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/skill_templates/lvkit-resolve/SKILL.md +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/skill_templates/lvkit-review/SKILL.md +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/structure.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/terminal_collector.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/text_encoding.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/tools/__init__.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/tools/connector_geometry_profile.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/type_defaults.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/unresolved.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/vi_diff.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/src/lvkit/vilib_resolver.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/__init__.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/conftest.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/29/PROVENANCE.md +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/29/Test LVKit/Lib1/Class/Class.lvclass +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/29/Test LVKit/Lib1/Class/Do.vi +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/29/Test LVKit/Lib1/Lib1.lvlib +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/29/Test LVKit/Lib2/Class/Class.lvclass +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/29/Test LVKit/Lib2/Class/Do.vi +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/29/Test LVKit/Lib2/Class/Test.vi +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/29/Test LVKit/Lib2/Lib2.lvlib +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/29/Test LVKit/Test LVKit.aliases +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/29/Test LVKit/Test LVKit.lvlps +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/29/Test LVKit/Test LVKit.lvproj +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/30/PROVENANCE.md +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/30/visible-frame-case-sequence.vi +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/30/visible-frame-conditional-disable.vi +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/31/PROVENANCE.md +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/31/disable-structure-frame-names.vi +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/32/PROVENANCE.md +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/32/comments-and-decorations.vi +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/33/PROVENANCE.md +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/33/coercion-dot-consistency.vi +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/34/PROVENANCE.md +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/34/hidden-iteration-terminal.vi +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/35/PROVENANCE.md +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/35/objects-hidden-by-structures.vi +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/36/PROVENANCE.md +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/36/bundle-unbundle-names.vi +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/37/PROVENANCE.md +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/37/structure-tunnel-wire-bends.vi +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/38/PROVENANCE.md +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/38/auto-concatenating-tunnel.vi +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/39/PROVENANCE.md +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/39/zorder-not-respected.vi +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/corpus/issues/README.md +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/helpers.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_array_ops_codegen.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_ast_builder.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_ast_optimizer.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_case_codegen.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_case_parser.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_class_field_walkup.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_class_parent_linkinfo.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_class_properties.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_cli.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_cli_cache.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_cli_graph_ops.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_cli_query.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_codegen_context.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_compound_codegen.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_condition_builder.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_connector_geometry.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_connector_pane_label_recovery.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_connector_pane_patterns.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_connector_pane_render.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_conp_types.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_constant_decoding.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_dependency_path_refs.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_determinism.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_diff.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_diff_properties.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_diff_viewer.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_disable_graph.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_disable_parser.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_docs_class_hierarchy.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_docs_render.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_driver_codegen.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_dynamic_dispatch.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_e2e_codegen.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_elementwise.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_error_codegen.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_error_handling.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_error_terminal_label_fallback.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_event_codegen.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_event_parser.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_extraction_cache.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_extractor_concurrency.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_extractor_long_path.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_first_call_codegen.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_formula_codegen.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_formula_runtime.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_formula_semantics.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_formula_transpile.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_fp_heap_type.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_frame_attribution.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_frame_zplane.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_glyphs.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_graceful_degradation.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_help_tip.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_import_startup.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_in_place_codegen.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_index.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_index_sql.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_index_warm_no_downgrade.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_interface_order.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_issue_corpus.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_label_extraction.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_labview_queue.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_load_mode.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_load_upgrade.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_loop_codegen.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_lv_detect.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_lvpy.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_mcp_cache.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_mcp_evals.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_mcp_roots.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_naming.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_netlist.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_netlist_json.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_new_codegen.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_node_properties.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_output_cache.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_parallel_codegen.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_parallel_parse.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_parser.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_parser_regression.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_primitive_name_uniqueness.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_primitive_positional_order.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_primitive_resolutions.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_progressive_index.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_progressive_warm.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_project_store.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_queue_codegen.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_render.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_render_emission_order.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_render_viewer.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_sequence.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_soft_codegen.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_structure_lvproj.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_subvi_nav.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_text_encoding.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_type_driven_fixes.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_type_fields.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_type_loading.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_type_mapping.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_unknown_nodes.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_unresolved.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_vi_graph.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_vi_properties.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_viewer_properties.py +0 -0
- {lvkit-0.7.0 → lvkit-0.7.2}/tests/test_vilib_docurls.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: lvkit
|
|
3
|
-
Version: 0.7.
|
|
3
|
+
Version: 0.7.2
|
|
4
4
|
Summary: Understand and convert LabVIEW VIs to Python without a LabVIEW license
|
|
5
5
|
Project-URL: Repository, https://github.com/pragmatest-dev/lvkit
|
|
6
6
|
Project-URL: Issues, https://github.com/pragmatest-dev/lvkit/issues
|
|
@@ -35,6 +35,16 @@ Mode banner.
|
|
|
35
35
|
| `lvkit.searchPaths` | `[]` | Extra dirs to search for SubVIs (repo root is auto-detected). |
|
|
36
36
|
| `lvkit.diagramTheme` | `auto` | Diagram color theme (`auto`/`light`/`dark`); updated automatically when you cycle the in-viewer theme control. |
|
|
37
37
|
|
|
38
|
+
## Recommending LVKit to your team
|
|
39
|
+
|
|
40
|
+
If your project has LabVIEW files, add LVKit to your workspace's recommended
|
|
41
|
+
extensions so teammates are prompted to install it when they open the folder:
|
|
42
|
+
|
|
43
|
+
```json
|
|
44
|
+
// .vscode/extensions.json
|
|
45
|
+
{ "recommendations": ["pragmatest.lvkit"] }
|
|
46
|
+
```
|
|
47
|
+
|
|
38
48
|
## Trademarks
|
|
39
49
|
|
|
40
50
|
LVKit is an independent, clean-room project, not affiliated with, authorized by,
|
|
@@ -4,7 +4,7 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
from typing import TYPE_CHECKING
|
|
6
6
|
|
|
7
|
-
__version__ = "0.7.
|
|
7
|
+
__version__ = "0.7.2"
|
|
8
8
|
|
|
9
9
|
# The public API is exposed LAZILY (PEP 562 module ``__getattr__``): the graph /
|
|
10
10
|
# parser / structure stacks (networkx, pydantic, pylabview, PIL — ~230 ms) load
|
|
@@ -4,6 +4,8 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
import argparse
|
|
6
6
|
import json
|
|
7
|
+
import os
|
|
8
|
+
import subprocess
|
|
7
9
|
import sys
|
|
8
10
|
import traceback
|
|
9
11
|
import webbrowser
|
|
@@ -362,16 +364,23 @@ def main() -> int:
|
|
|
362
364
|
"-v",
|
|
363
365
|
"--verbose",
|
|
364
366
|
action="store_true",
|
|
365
|
-
help=
|
|
367
|
+
help=(
|
|
368
|
+
"Show full detail within each section (every VI Property, "
|
|
369
|
+
"Health, connector-pattern/pane-slot annotations, typed "
|
|
370
|
+
"terminals); with --format netlist, also emit a typed "
|
|
371
|
+
"## Components section before the netlist body."
|
|
372
|
+
),
|
|
366
373
|
)
|
|
367
374
|
desc_parser.add_argument(
|
|
368
375
|
"--format",
|
|
369
|
-
choices=["text", "json"],
|
|
376
|
+
choices=["text", "netlist", "json"],
|
|
370
377
|
default="text",
|
|
371
378
|
help=(
|
|
372
|
-
"'text' (default) prints the human-readable description;
|
|
373
|
-
"
|
|
374
|
-
"
|
|
379
|
+
"'text' (default) prints the human-readable description; "
|
|
380
|
+
"'netlist' prints the VI dataflow netlist body — the git-"
|
|
381
|
+
"textconv-friendly form (see `lvkit setup --git-textconv`); "
|
|
382
|
+
"'json' emits the canonical netlist IR — the same structured "
|
|
383
|
+
"payload the MCP read_vi tool returns — for a program to parse."
|
|
375
384
|
),
|
|
376
385
|
)
|
|
377
386
|
_add_project_root_arg(desc_parser)
|
|
@@ -627,6 +636,28 @@ def main() -> int:
|
|
|
627
636
|
action="store_true",
|
|
628
637
|
help="Overwrite existing skill files even if they have local edits",
|
|
629
638
|
)
|
|
639
|
+
setup_parser.add_argument(
|
|
640
|
+
"--git-textconv",
|
|
641
|
+
action="store_true",
|
|
642
|
+
help=(
|
|
643
|
+
"Wire up `git diff`/`git show` on .vi files to render lvkit's "
|
|
644
|
+
"netlist text instead of the raw binary: appends `*.vi "
|
|
645
|
+
"diff=lvkit` to .gitattributes and sets the `diff.lvkit."
|
|
646
|
+
"textconv`/`diff.lvkit.cachetextconv` git config in the current "
|
|
647
|
+
"repo. Does ONLY this — skips the .lvkit/ store + skill install."
|
|
648
|
+
),
|
|
649
|
+
)
|
|
650
|
+
setup_parser.add_argument(
|
|
651
|
+
"--textconv-format",
|
|
652
|
+
choices=["netlist", "text", "json"],
|
|
653
|
+
default="netlist",
|
|
654
|
+
help=(
|
|
655
|
+
"Which `describe` format `--git-textconv` renders in a `git diff`: "
|
|
656
|
+
"'netlist' (default, the dataflow netlist — most diff-friendly), "
|
|
657
|
+
"'text' (the human summary), or 'json' (the structured IR). The VS "
|
|
658
|
+
"Code extension sets this from the `lvkit.viTextFormat` setting."
|
|
659
|
+
),
|
|
660
|
+
)
|
|
630
661
|
|
|
631
662
|
# Unresolved command - batch-collect every resolution gap
|
|
632
663
|
unresolved_parser = subparsers.add_parser(
|
|
@@ -1104,6 +1135,26 @@ def cmd_query(args: argparse.Namespace) -> int:
|
|
|
1104
1135
|
return 0
|
|
1105
1136
|
|
|
1106
1137
|
|
|
1138
|
+
def _repo_relative_path(source: Path | None, base: Path) -> str | None:
|
|
1139
|
+
"""Best-effort repo/project-relative display path for ``source`` against
|
|
1140
|
+
``base`` -- for the ``-- <path>`` comment on each SubVI in a verbose
|
|
1141
|
+
``describe --format netlist`` ``## Components`` line, so a VS Code terminal
|
|
1142
|
+
can click straight to the dependency instead of showing an absolute path.
|
|
1143
|
+
|
|
1144
|
+
Defensive by design: ``None`` when ``source`` is unresolvable (unknown/
|
|
1145
|
+
unloaded VI) or ``os.path.relpath`` itself fails (e.g. a cross-drive path
|
|
1146
|
+
on Windows, which raises ``ValueError``) -- a describe path annotation is
|
|
1147
|
+
decoration, never load-bearing, so it silently falls back rather than
|
|
1148
|
+
crashing the command.
|
|
1149
|
+
"""
|
|
1150
|
+
if source is None:
|
|
1151
|
+
return None
|
|
1152
|
+
try:
|
|
1153
|
+
return os.path.relpath(source.resolve(), base.resolve())
|
|
1154
|
+
except (OSError, ValueError):
|
|
1155
|
+
return None
|
|
1156
|
+
|
|
1157
|
+
|
|
1107
1158
|
def cmd_describe(args: argparse.Namespace) -> int:
|
|
1108
1159
|
"""Handle the describe command - human-readable VI description."""
|
|
1109
1160
|
from .graph.describe import describe_vi
|
|
@@ -1148,7 +1199,8 @@ def cmd_describe(args: argparse.Namespace) -> int:
|
|
|
1148
1199
|
# VI (and its SubVIs under MINIMAL), so warm all of them.
|
|
1149
1200
|
warm_all_loaded(graph)
|
|
1150
1201
|
|
|
1151
|
-
|
|
1202
|
+
fmt = getattr(args, "format", "text")
|
|
1203
|
+
if fmt == "json":
|
|
1152
1204
|
# Same structured netlist IR the MCP read_vi tool returns — parity
|
|
1153
1205
|
# so a non-MCP (CLI/CI/skill) consumer gets the structured read too.
|
|
1154
1206
|
from .graph.netlist import build_netlist, netlist_to_dict
|
|
@@ -1158,6 +1210,48 @@ def cmd_describe(args: argparse.Namespace) -> int:
|
|
|
1158
1210
|
netlist_to_dict(build_netlist(graph, vi_name)), indent=2
|
|
1159
1211
|
)
|
|
1160
1212
|
)
|
|
1213
|
+
elif fmt == "netlist":
|
|
1214
|
+
# The dataflow netlist body alone — the git-textconv-friendly
|
|
1215
|
+
# form (`lvkit setup --git-textconv`): a diff of two commits'
|
|
1216
|
+
# `.vi` blobs through this render is a meaningful, near-source-
|
|
1217
|
+
# stable text diff. The VI-line always uses the qualified display
|
|
1218
|
+
# name (never an abspath — that would make every clone's diff
|
|
1219
|
+
# differ), IDENTICAL in base and verbose. Verbose adds only a
|
|
1220
|
+
# `## Components` declaration table with each SubVI's repo-relative
|
|
1221
|
+
# path as a clickable `-- ` comment (paths never touch the semantic
|
|
1222
|
+
# lines, and don't resolve under textconv's isolated blob anyway).
|
|
1223
|
+
from .graph.netlist import build_netlist, component_line, render_netlist
|
|
1224
|
+
|
|
1225
|
+
module = build_netlist(graph, vi_name)
|
|
1226
|
+
# SubVI paths are resolved relative to — the first auto-detected
|
|
1227
|
+
# search path (explicit --search-path wins, else the input's own
|
|
1228
|
+
# enclosing .lvkit/ project root), falling back to the input's own
|
|
1229
|
+
# directory. So a VS Code terminal can click straight to the dep.
|
|
1230
|
+
rel_base = search_paths[0] if search_paths else input_path.parent
|
|
1231
|
+
|
|
1232
|
+
# The VI signature line always uses the QUALIFIED name — identical in
|
|
1233
|
+
# base and verbose, so the netlist body diffs the same either way.
|
|
1234
|
+
# Paths live only in verbose, and only as COMMENTS (never in the
|
|
1235
|
+
# semantic lines): each called SubVI's repo-relative path as a
|
|
1236
|
+
# trailing `-- ` comment on its ## Components declaration (clickable),
|
|
1237
|
+
# skipped for primitives / unresolved SubVIs.
|
|
1238
|
+
display_name = graph.vi_display_name(vi_name)
|
|
1239
|
+
|
|
1240
|
+
out_lines: list[str] = []
|
|
1241
|
+
if args.verbose and module.components:
|
|
1242
|
+
out_lines.append("## Components")
|
|
1243
|
+
for c in module.components:
|
|
1244
|
+
line = f" {component_line(c)}"
|
|
1245
|
+
comp_rel = _repo_relative_path(
|
|
1246
|
+
graph.get_vi_source_path(c.name), rel_base
|
|
1247
|
+
)
|
|
1248
|
+
if comp_rel is not None:
|
|
1249
|
+
line += f" -- {comp_rel}"
|
|
1250
|
+
out_lines.append(line)
|
|
1251
|
+
out_lines.append("")
|
|
1252
|
+
|
|
1253
|
+
out_lines.append(render_netlist(module, display_name=display_name))
|
|
1254
|
+
print("\n".join(out_lines))
|
|
1161
1255
|
else:
|
|
1162
1256
|
print(describe_vi(graph, vi_name, verbose=args.verbose))
|
|
1163
1257
|
|
|
@@ -1188,8 +1282,83 @@ def _detect_ai_editors(root: Path) -> list[str]:
|
|
|
1188
1282
|
return editors
|
|
1189
1283
|
|
|
1190
1284
|
|
|
1285
|
+
def _setup_git_textconv(root: Path, fmt: str = "netlist") -> int:
|
|
1286
|
+
"""Wire up ``git diff``/``git show`` on ``.vi`` files to render lvkit's
|
|
1287
|
+
``describe`` text (``lvkit describe --format <fmt>``, default the dataflow
|
|
1288
|
+
``netlist``) instead of the raw binary blob — the ``lvkit setup
|
|
1289
|
+
--git-textconv`` mode.
|
|
1290
|
+
|
|
1291
|
+
Appends ``*.vi diff=lvkit`` to the repo's ``.gitattributes`` (creating it
|
|
1292
|
+
if missing; a no-op if the line is already present) and sets the
|
|
1293
|
+
``diff.lvkit.textconv``/``diff.lvkit.cachetextconv`` git config in the
|
|
1294
|
+
repo ``root`` belongs to. Requires ``root`` to be inside a git repo —
|
|
1295
|
+
reports a clear error and a non-zero exit otherwise (this is a git-only
|
|
1296
|
+
feature; there is nothing sensible to do without one).
|
|
1297
|
+
"""
|
|
1298
|
+
repo_toplevel = subprocess.run(
|
|
1299
|
+
["git", "rev-parse", "--show-toplevel"],
|
|
1300
|
+
cwd=root,
|
|
1301
|
+
capture_output=True,
|
|
1302
|
+
text=True,
|
|
1303
|
+
check=False,
|
|
1304
|
+
)
|
|
1305
|
+
if repo_toplevel.returncode != 0:
|
|
1306
|
+
print(
|
|
1307
|
+
f"Error: {root} is not inside a git repository — "
|
|
1308
|
+
"--git-textconv requires git (see `git init`).",
|
|
1309
|
+
file=sys.stderr,
|
|
1310
|
+
)
|
|
1311
|
+
return 1
|
|
1312
|
+
repo_root = Path(repo_toplevel.stdout.strip())
|
|
1313
|
+
|
|
1314
|
+
attrs_path = repo_root / ".gitattributes"
|
|
1315
|
+
attrs_line = "*.vi diff=lvkit"
|
|
1316
|
+
existing = attrs_path.read_text(encoding="utf-8") if attrs_path.is_file() else ""
|
|
1317
|
+
if attrs_line in existing.splitlines():
|
|
1318
|
+
print(f"{attrs_path}: already has `{attrs_line}`")
|
|
1319
|
+
else:
|
|
1320
|
+
if existing and not existing.endswith("\n"):
|
|
1321
|
+
existing += "\n"
|
|
1322
|
+
attrs_path.write_text(existing + attrs_line + "\n", encoding="utf-8")
|
|
1323
|
+
print(f"{attrs_path}: added `{attrs_line}`")
|
|
1324
|
+
|
|
1325
|
+
textconv_cmd = f"lvkit describe --format {fmt}"
|
|
1326
|
+
for key, value in (
|
|
1327
|
+
("diff.lvkit.textconv", textconv_cmd),
|
|
1328
|
+
("diff.lvkit.cachetextconv", "true"),
|
|
1329
|
+
):
|
|
1330
|
+
result = subprocess.run(
|
|
1331
|
+
["git", "config", key, value],
|
|
1332
|
+
cwd=repo_root,
|
|
1333
|
+
capture_output=True,
|
|
1334
|
+
text=True,
|
|
1335
|
+
check=False,
|
|
1336
|
+
)
|
|
1337
|
+
if result.returncode != 0:
|
|
1338
|
+
print(
|
|
1339
|
+
f"Error: `git config {key} {value!r}` failed: "
|
|
1340
|
+
f"{result.stderr.strip()}",
|
|
1341
|
+
file=sys.stderr,
|
|
1342
|
+
)
|
|
1343
|
+
return 1
|
|
1344
|
+
print(f"git config {key} {value!r}")
|
|
1345
|
+
|
|
1346
|
+
print(
|
|
1347
|
+
"\nGit textconv configured. `git diff`/`git show` on .vi files now "
|
|
1348
|
+
"render lvkit's netlist text."
|
|
1349
|
+
)
|
|
1350
|
+
return 0
|
|
1351
|
+
|
|
1352
|
+
|
|
1191
1353
|
def cmd_setup(args: argparse.Namespace) -> int:
|
|
1192
1354
|
"""Handle the setup command — install AI skills and create .lvkit/ store."""
|
|
1355
|
+
if getattr(args, "git_textconv", False):
|
|
1356
|
+
root = Path(args.directory or ".").resolve()
|
|
1357
|
+
if not root.is_dir():
|
|
1358
|
+
print(f"Error: Not a directory: {root}", file=sys.stderr)
|
|
1359
|
+
return 1
|
|
1360
|
+
return _setup_git_textconv(root, getattr(args, "textconv_format", "netlist"))
|
|
1361
|
+
|
|
1193
1362
|
# `directory` and `skills` are both optional positionals, so a lone
|
|
1194
1363
|
# `lvkit setup copilot` binds "copilot" to `directory`. If the only
|
|
1195
1364
|
# positional given is a skills choice, treat it as the skills target in
|
|
@@ -38,7 +38,6 @@ from .models import (
|
|
|
38
38
|
WindowProps,
|
|
39
39
|
bool_str,
|
|
40
40
|
)
|
|
41
|
-
from .netlist import build_netlist, component_line, render_netlist
|
|
42
41
|
from .op_walk import (
|
|
43
42
|
_const_value_str,
|
|
44
43
|
_has_output_tunnel,
|
|
@@ -61,17 +60,18 @@ def describe_vi(
|
|
|
61
60
|
"""Describe a VI as a documentation page.
|
|
62
61
|
|
|
63
62
|
Uses the graph's resolved types, names, constants, and dataflow to
|
|
64
|
-
produce a complete reference for what this VI does.
|
|
65
|
-
|
|
63
|
+
produce a complete reference for what this VI does. Output (verbose or
|
|
64
|
+
not) always has the same section shape: Inputs/Outputs/Class/Constants,
|
|
66
65
|
then ``## Dependencies`` (subVI signatures) / ``## Control Flow`` /
|
|
67
66
|
``## Operations``.
|
|
68
67
|
|
|
69
|
-
``verbose``
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
68
|
+
``verbose`` (``-v``) only adds DEPTH within those same sections -- every
|
|
69
|
+
VI Property (not just non-default ones), the ``## Health`` section even
|
|
70
|
+
when healthy, each pane terminal's connector-pattern slot index, and
|
|
71
|
+
typed terminal detail -- it never swaps in a different section shape.
|
|
72
|
+
The dataflow NETLIST (the declare-then-wire ``## Components`` +
|
|
73
|
+
node-first wiring body) is a SEPARATE output entirely -- see
|
|
74
|
+
``lvkit.graph.netlist`` and the CLI's ``describe --format netlist``.
|
|
75
75
|
"""
|
|
76
76
|
vi_name = graph.resolve_vi_name(vi_name)
|
|
77
77
|
ctx = graph.get_vi_context(vi_name)
|
|
@@ -143,59 +143,41 @@ def describe_vi(
|
|
|
143
143
|
lines.append(f" {_describe_label_line(lbl)}")
|
|
144
144
|
lines.append("")
|
|
145
145
|
|
|
146
|
-
#
|
|
147
|
-
|
|
146
|
+
# Dependencies: SubVI calls with their signatures and descriptions.
|
|
147
|
+
# Same shape verbose or not -- verbose only deepens Properties/Health/
|
|
148
|
+
# pane detail above; it never swaps this section out.
|
|
149
|
+
subvi_names = _collect_subvi_names(ctx.operations)
|
|
150
|
+
if subvi_names:
|
|
151
|
+
lines.append("## Dependencies")
|
|
152
|
+
for name in sorted(subvi_names):
|
|
153
|
+
desc = _get_subvi_description(graph, name)
|
|
154
|
+
ports = _subvi_ports(graph, name)
|
|
155
|
+
sig = _render_ports(*ports) if ports is not None else None
|
|
156
|
+
entry = f" {name}"
|
|
157
|
+
if sig:
|
|
158
|
+
entry += f": {sig}"
|
|
159
|
+
if desc:
|
|
160
|
+
entry += f" -- {desc}"
|
|
161
|
+
lines.append(entry)
|
|
162
|
+
lines.append("")
|
|
148
163
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
lines.append("
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
if sig:
|
|
167
|
-
entry += f": {sig}"
|
|
168
|
-
if desc:
|
|
169
|
-
entry += f" -- {desc}"
|
|
170
|
-
lines.append(entry)
|
|
171
|
-
lines.append("")
|
|
172
|
-
|
|
173
|
-
# Control flow: non-verbose only. Verbose's ``## Netlist`` below already
|
|
174
|
-
# covers control flow in full (its ``case (selector):`` scopes, with
|
|
175
|
-
# correctly tunnel-resolved selectors) -- this shallower summary would
|
|
176
|
-
# be both redundant and stale there (its selector naming doesn't hop
|
|
177
|
-
# through tunnels the way ``build_netlist`` does).
|
|
178
|
-
if not verbose:
|
|
179
|
-
structures = _collect_structures(
|
|
180
|
-
graph,
|
|
181
|
-
ctx,
|
|
182
|
-
ctx.operations,
|
|
183
|
-
index_terminal_owners(ctx.operations),
|
|
184
|
-
)
|
|
185
|
-
if structures:
|
|
186
|
-
lines.append("## Control Flow")
|
|
187
|
-
for s in structures:
|
|
188
|
-
lines.append(f" {s}")
|
|
189
|
-
lines.append("")
|
|
190
|
-
|
|
191
|
-
if verbose:
|
|
192
|
-
assert netlist_module is not None
|
|
193
|
-
lines.append("## Netlist")
|
|
194
|
-
lines.append(render_netlist(netlist_module))
|
|
195
|
-
else:
|
|
196
|
-
# Operations
|
|
197
|
-
lines.append("## Operations")
|
|
198
|
-
_describe_op_list(ctx.operations, ctx.constants, lines, indent=0)
|
|
164
|
+
# Control flow: structure summary (case/loop/sequence/... with their
|
|
165
|
+
# gating selectors traced one hop back to the source).
|
|
166
|
+
structures = _collect_structures(
|
|
167
|
+
graph,
|
|
168
|
+
ctx,
|
|
169
|
+
ctx.operations,
|
|
170
|
+
index_terminal_owners(ctx.operations),
|
|
171
|
+
)
|
|
172
|
+
if structures:
|
|
173
|
+
lines.append("## Control Flow")
|
|
174
|
+
for s in structures:
|
|
175
|
+
lines.append(f" {s}")
|
|
176
|
+
lines.append("")
|
|
177
|
+
|
|
178
|
+
# Operations
|
|
179
|
+
lines.append("## Operations")
|
|
180
|
+
_describe_op_list(ctx.operations, ctx.constants, lines, indent=0)
|
|
199
181
|
|
|
200
182
|
return "\n".join(lines)
|
|
201
183
|
|
|
@@ -2496,10 +2496,17 @@ def netlist_to_dict(module: NetlistModule) -> dict[str, Any]:
|
|
|
2496
2496
|
}
|
|
2497
2497
|
|
|
2498
2498
|
|
|
2499
|
-
def render_netlist(module: NetlistModule) -> str:
|
|
2499
|
+
def render_netlist(module: NetlistModule, *, display_name: str | None = None) -> str:
|
|
2500
2500
|
"""Render a ``NetlistModule`` to the locked netlist text syntax.
|
|
2501
2501
|
|
|
2502
2502
|
See ``.tmp/netlist-spec.md`` -- syntax is LOCKED, ASCII only.
|
|
2503
|
+
|
|
2504
|
+
``display_name`` overrides the header line's VI label (``module.vi_name``
|
|
2505
|
+
is the resolved ``vi_key`` -- a source-path identity, not fit for
|
|
2506
|
+
display -- see ``describe.py``'s ``--format netlist`` naming rules,
|
|
2507
|
+
which pass the qualified display name or a repo-relative path here).
|
|
2508
|
+
Defaults to ``module.vi_name`` for every existing caller (JSON/diff/the
|
|
2509
|
+
embedded viewer never pass this).
|
|
2503
2510
|
"""
|
|
2504
2511
|
lines: list[str] = []
|
|
2505
2512
|
in_names = ", ".join(name for name, _ in module.inputs)
|
|
@@ -2512,7 +2519,8 @@ def render_netlist(module: NetlistModule) -> str:
|
|
|
2512
2519
|
else o.name
|
|
2513
2520
|
for o in module.outputs
|
|
2514
2521
|
)
|
|
2515
|
-
|
|
2522
|
+
header_name = display_name if display_name is not None else module.vi_name
|
|
2523
|
+
lines.append(f"{header_name} ({in_names}) -> ({out_names})")
|
|
2516
2524
|
|
|
2517
2525
|
_render_items(module.body, 0, lines, ambiguous)
|
|
2518
2526
|
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
``netlist``.
|
|
3
3
|
|
|
4
4
|
Split out to avoid a circular import: ``netlist.py`` needs these to trace
|
|
5
|
-
wires back to their producing operation, and ``describe.py``
|
|
6
|
-
|
|
7
|
-
module may import the other at module
|
|
8
|
-
live here instead.
|
|
5
|
+
wires back to their producing operation, and ``describe.py`` walks the same
|
|
6
|
+
operation tree for its own ``## Dependencies``/``## Control Flow``/
|
|
7
|
+
``## Operations`` sections. Neither module may import the other at module
|
|
8
|
+
level, so the shared walk helpers live here instead.
|
|
9
9
|
"""
|
|
10
10
|
|
|
11
11
|
from __future__ import annotations
|
|
@@ -56,8 +56,9 @@ wiring is expressed as `port -> source.net` bindings, not source order.
|
|
|
56
56
|
`components` lists each distinct subVI/primitive's typed port interface
|
|
57
57
|
once. This one call gives you everything — operations, wiring, structures,
|
|
58
58
|
and constants — in one structured tree instead of five separate reads.
|
|
59
|
-
`lvkit describe <vi-path> --search-path <library-path> -v`
|
|
60
|
-
prints the same facts as prose for a human instead of JSON for a program
|
|
59
|
+
`lvkit describe <vi-path> --search-path <library-path> --format netlist -v`
|
|
60
|
+
prints the same facts as prose for a human instead of JSON for a program (`-v`
|
|
61
|
+
adds the typed `## Components` declarations ahead of the netlist body).
|
|
61
62
|
|
|
62
63
|
**A structure's output is a named MERGE net, not a plain wire.** A value
|
|
63
64
|
leaving a case/loop/feedback node is selector- or iteration-dependent, so the
|
|
@@ -23,9 +23,11 @@ together, not five separate reads.
|
|
|
23
23
|
|
|
24
24
|
No MCP server connected? The CLI `lvkit describe` above is the twin of both:
|
|
25
25
|
plain (no `--format`) prints the same prose as MCP `describe`; `-v/--verbose`
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
26
|
+
shows full detail within each section (every VI Property, Health, typed
|
|
27
|
+
terminals) without changing its shape; `--format netlist` prints the VI
|
|
28
|
+
dataflow netlist body on its own (add `-v` for a typed `## Components`
|
|
29
|
+
section first); `--format json` emits the identical structured payload MCP
|
|
30
|
+
`read_vi` returns, for a program instead of a person to parse.
|
|
29
31
|
|
|
30
32
|
To see the VI's faithful block diagram, render it to SVG (CLI-only, no MCP
|
|
31
33
|
twin):
|
|
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
|
|
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
|