pyVHDLModelTreesitter 0.9.0__tar.gz → 0.10.0__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.
- {pyvhdlmodeltreesitter-0.9.0 → pyvhdlmodeltreesitter-0.10.0}/PKG-INFO +25 -14
- {pyvhdlmodeltreesitter-0.9.0 → pyvhdlmodeltreesitter-0.10.0}/README.md +10 -3
- {pyvhdlmodeltreesitter-0.9.0 → pyvhdlmodeltreesitter-0.10.0}/pyproject.toml +33 -11
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/Declaration.py +96 -0
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/Object.py +52 -0
- {pyvhdlmodeltreesitter-0.9.0 → pyvhdlmodeltreesitter-0.10.0}/src/pyVHDLModelTreesitter/_Association.py +7 -13
- {pyvhdlmodeltreesitter-0.9.0 → pyvhdlmodeltreesitter-0.10.0}/src/pyVHDLModelTreesitter/_Base.py +95 -23
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/_Common.py +60 -0
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/_Concurrent.py +661 -0
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/_Declaration.py +179 -0
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/_DesignUnit.py +555 -0
- {pyvhdlmodeltreesitter-0.9.0 → pyvhdlmodeltreesitter-0.10.0}/src/pyVHDLModelTreesitter/_Document.py +20 -40
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/_parse.py → pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/_Expression.py +266 -331
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/_Interface.py +312 -0
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/_Name.py +87 -0
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/_Object.py +138 -0
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/_Sequential.py +442 -0
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/_Subprogram.py +212 -0
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/_subtype_indication.py → pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/_Symbol.py +44 -64
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/_Type.py +313 -0
- {pyvhdlmodeltreesitter-0.9.0 → pyvhdlmodeltreesitter-0.10.0}/src/pyVHDLModelTreesitter/__init__.py +0 -2
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/_parse.py +97 -0
- {pyvhdlmodeltreesitter-0.9.0 → pyvhdlmodeltreesitter-0.10.0}/src/pyVHDLModelTreesitter/error.py +72 -29
- {pyvhdlmodeltreesitter-0.9.0 → pyvhdlmodeltreesitter-0.10.0}/src/pyVHDLModelTreesitter/format.py +65 -19
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/__init__.py +171 -0
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/_generated_queries.py +241 -0
- {pyvhdlmodeltreesitter-0.9.0 → pyvhdlmodeltreesitter-0.10.0}/src/pyVHDLModelTreesitter/queries/_query.py +103 -25
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/AliasDeclaration.scm +11 -0
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/AliasSignature.scm +8 -0
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/ArrayTypeDefinition.scm +19 -0
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/AssertionStatement.scm +8 -0
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/AttributeDeclaration.scm +4 -0
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/AttributeSpecification.scm +7 -0
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/BlockStatement.scm +12 -0
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/CaseGenerateAlternative.scm +10 -0
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/CaseGenerateStatement.scm +6 -0
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/CaseStatement.scm +5 -0
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/CaseStatementAlternative.scm +9 -0
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/ConcurrentAssertionStatement.scm +8 -0
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/ConditionalWaveforms.scm +7 -0
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/Constrained1DArray.scm +8 -0
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/ConstrainedScalar.scm +8 -0
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/entity_declaration.scm → pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/EntityDeclaration.scm +1 -1
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/EntityNameList.scm +3 -0
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/EnumerationTypeDefinition.scm +8 -0
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/ExitStatement.scm +10 -0
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/FileDeclaration.scm +12 -0
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/ForGenerateStatement.scm +13 -0
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/FunctionCall.scm +9 -0
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/FunctionSpecification.scm +5 -0
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/IfElsifStatement.scm +19 -0
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/IfGenerateBranch.scm +29 -0
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/IfGenerateStatement.scm +7 -0
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/IfStatementBlock.scm +5 -0
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/InterfaceDeclarations.scm +12 -0
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/InterfaceList.scm +9 -0
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/InterfaceObjectDeclaration.scm +55 -0
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/InterfacePackageDeclaration.scm +3 -0
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/InterfaceSubprogramDeclaration.scm +15 -0
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/InterfaceTypeDeclaration.scm +3 -0
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/LoopStatement.scm +16 -0
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/MultiplyingExpression.scm +5 -0
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/NextStatement.scm +10 -0
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/PackageDeclaration.scm +9 -0
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/PhysicalTypeDefinition.scm +15 -0
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/ProcedureSpecification.scm +4 -0
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/ReportStatement.scm +5 -0
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/ReturnStatement.scm +8 -0
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/SequentialVariableAssignment.scm +6 -0
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/SimpleSignalAssignment.scm +12 -0
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/SimpleSubtype.scm +5 -0
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/TargetName.scm +6 -0
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/TypeConversion.scm +9 -0
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/type_declaration.scm → pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/TypeDeclaration.scm +9 -1
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/UnaryExpression.scm +4 -0
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/UseClause.scm +3 -0
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/treesitter/__init__.py +18 -0
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/treesitter/_access.py +28 -0
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/_protocol.py → pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/treesitter/_map.py +2 -26
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/treesitter/_sort.py +36 -0
- pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/treesitter/formatting.py +53 -0
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/_Concurrent.py +0 -239
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/_Design.py +0 -24
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/_DesignUnit.py +0 -427
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/_Interface.py +0 -138
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/_Name.py +0 -20
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/_Object.py +0 -90
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/_Sequential.py +0 -172
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/_Type.py +0 -134
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/__init__.py +0 -9
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/_generated_queries.py +0 -193
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/_utils.py +0 -149
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/concurrent_simple_signal_assignment.scm +0 -6
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/constrained_1d_array.scm +0 -17
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/constrained_scalar.scm +0 -17
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/enumeration_type_definition.scm +0 -5
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/function_call.scm +0 -27
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/if_elsif_statement.scm +0 -18
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/if_statement_block.scm +0 -3
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/interface_declaration.scm +0 -36
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/interface_declarations.scm +0 -6
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/multiplying_expression.scm +0 -11
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/package_declaration.scm +0 -5
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/simple_subtype.scm +0 -11
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/type_conversion.scm +0 -18
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/unary_expression.scm +0 -9
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/use_clauses.scm +0 -1
- {pyvhdlmodeltreesitter-0.9.0 → pyvhdlmodeltreesitter-0.10.0}/.gitignore +0 -0
- {pyvhdlmodeltreesitter-0.9.0 → pyvhdlmodeltreesitter-0.10.0}/LICENSE +0 -0
- {pyvhdlmodeltreesitter-0.9.0 → pyvhdlmodeltreesitter-0.10.0}/src/pyVHDLModelTreesitter/Expression.py +0 -0
- {pyvhdlmodeltreesitter-0.9.0 → pyvhdlmodeltreesitter-0.10.0}/src/pyVHDLModelTreesitter/py.typed +0 -0
- /pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/adding_expression.scm → /pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/AddingExpression.scm +0 -0
- /pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/aggregate.scm → /pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/Aggregate.scm +0 -0
- /pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/architecture_definition.scm → /pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/ArchitectureDefinition.scm +0 -0
- /pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/association_element.scm → /pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/AssociationElement.scm +0 -0
- /pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/association_elements.scm → /pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/AssociationElements.scm +0 -0
- /pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/association_list_simple_range.scm → /pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/AssociationListSimpleRange.scm +0 -0
- /pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/bit_string_literal.scm → /pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/BitStringLiteral.scm +0 -0
- /pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/component_declaration.scm → /pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/ComponentDeclaration.scm +0 -0
- /pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/component_instantiation_statement.scm → /pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/ComponentInstantiationStatement.scm +0 -0
- /pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/concurrent_conditional_signal_assignment.scm → /pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/ConcurrentConditionalSignalAssignment.scm +0 -0
- /pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/constant_declaration.scm → /pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/ConstantDeclaration.scm +0 -0
- /pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/design_units.scm → /pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/DesignUnits.scm +0 -0
- /pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/else_statement.scm → /pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/ElseStatement.scm +0 -0
- /pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/indexed_name.scm → /pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/IndexedName.scm +0 -0
- /pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/library_clauses.scm → /pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/LibraryClauses.scm +0 -0
- /pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/library_namespaces.scm → /pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/LibraryNamespaces.scm +0 -0
- /pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/logical_expression.scm → /pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/LogicalExpression.scm +0 -0
- /pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/package_definition.scm → /pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/PackageDefinition.scm +0 -0
- /pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/physical_literal.scm → /pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/PhysicalLiteral.scm +0 -0
- /pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/process_statement.scm → /pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/ProcessStatement.scm +0 -0
- /pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/record_type_definition.scm → /pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/RecordTypeDefinition.scm +0 -0
- /pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/relational_expression.scm → /pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/RelationalExpression.scm +0 -0
- /pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/selected_names.scm → /pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/SelectedNames.scm +0 -0
- /pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/shift_expression.scm → /pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/ShiftExpression.scm +0 -0
- /pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/signal_declaration.scm → /pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/SignalDeclaration.scm +0 -0
- /pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/subtype_declaration.scm → /pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/SubtypeDeclaration.scm +0 -0
- /pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/variable_declaration.scm → /pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/VariableDeclaration.scm +0 -0
- /pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/wait_statement.scm → /pyvhdlmodeltreesitter-0.10.0/src/pyVHDLModelTreesitter/queries/query-files/WaitStatement.scm +0 -0
|
@@ -1,14 +1,15 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
2
|
Name: pyVHDLModelTreesitter
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.10.0
|
|
4
4
|
Summary: An implementation of pyVHDLModel using treesitter
|
|
5
5
|
Project-URL: Repository, https://gitlab.com/dawalters/pyVHDLModelTreesitter
|
|
6
6
|
Author: Dominic Adam Walters
|
|
7
|
+
License-Expression: Apache-2.0
|
|
7
8
|
License-File: LICENSE
|
|
8
9
|
Keywords: language,model,treesitter,vhdl
|
|
9
10
|
Classifier: Development Status :: 3 - Alpha
|
|
10
11
|
Classifier: Intended Audience :: Developers
|
|
11
|
-
Classifier: License :: OSI Approved ::
|
|
12
|
+
Classifier: License :: OSI Approved :: Apache Software License
|
|
12
13
|
Classifier: Programming Language :: Python :: 3 :: Only
|
|
13
14
|
Classifier: Programming Language :: Python :: 3.11
|
|
14
15
|
Classifier: Programming Language :: Python :: 3.12
|
|
@@ -18,24 +19,27 @@ Requires-Python: >=3.11
|
|
|
18
19
|
Requires-Dist: pygments>=2.20.0
|
|
19
20
|
Requires-Dist: pyvhdlmodel>=0.38.0
|
|
20
21
|
Requires-Dist: rich>=11.0.0
|
|
21
|
-
Requires-Dist: tree-sitter-vhdl>=
|
|
22
|
+
Requires-Dist: tree-sitter-vhdl>=2.0.0
|
|
22
23
|
Requires-Dist: tree-sitter>=0.23.0
|
|
23
24
|
Provides-Extra: dev
|
|
24
|
-
Requires-Dist:
|
|
25
|
+
Requires-Dist: codespell>=2.4.3; extra == 'dev'
|
|
26
|
+
Requires-Dist: coverage>=7.15.4; extra == 'dev'
|
|
25
27
|
Requires-Dist: cryptography>=49.0.0; extra == 'dev'
|
|
26
|
-
Requires-Dist:
|
|
28
|
+
Requires-Dist: git-cliff>=2.13.1; extra == 'dev'
|
|
29
|
+
Requires-Dist: hatch>=1.18.0; extra == 'dev'
|
|
27
30
|
Requires-Dist: idna>=3.18; extra == 'dev'
|
|
28
31
|
Requires-Dist: jaraco-context>=6.1.2; extra == 'dev'
|
|
29
|
-
Requires-Dist: mypy>=2.3.
|
|
30
|
-
Requires-Dist: pre-commit>=4.6.
|
|
32
|
+
Requires-Dist: mypy>=2.3.1; extra == 'dev'
|
|
33
|
+
Requires-Dist: pre-commit>=4.6.2; extra == 'dev'
|
|
31
34
|
Requires-Dist: pytest-cov>=7.1.0; extra == 'dev'
|
|
32
35
|
Requires-Dist: pytest-order>=1.5.0; extra == 'dev'
|
|
33
36
|
Requires-Dist: pytest-sugar>=1.1.1; extra == 'dev'
|
|
34
37
|
Requires-Dist: pytest-xdist>=3.8.0; extra == 'dev'
|
|
35
38
|
Requires-Dist: pytest>=9.1.1; extra == 'dev'
|
|
36
|
-
Requires-Dist: ruff>=0.16.
|
|
37
|
-
Requires-Dist: ty>=0.0.
|
|
38
|
-
Requires-Dist: uv>=0.12.
|
|
39
|
+
Requires-Dist: ruff>=0.16.4; extra == 'dev'
|
|
40
|
+
Requires-Dist: ty>=0.0.74; extra == 'dev'
|
|
41
|
+
Requires-Dist: uv>=0.12.5; extra == 'dev'
|
|
42
|
+
Requires-Dist: vsg>=3.35.0; extra == 'dev'
|
|
39
43
|
Description-Content-Type: text/markdown
|
|
40
44
|
|
|
41
45
|
# pyVHDLModelTreesitter
|
|
@@ -50,8 +54,13 @@ Description-Content-Type: text/markdown
|
|
|
50
54
|
[`pyVHDLModel`][pyVHDLModel-github] API using
|
|
51
55
|
[`tree-sitter-vhdl`][tree-sitter-vhdl].
|
|
52
56
|
|
|
53
|
-
|
|
54
|
-
|
|
57
|
+
## Implementation Status Disclaimer
|
|
58
|
+
|
|
59
|
+
This project is in early development and only implements a fraction of the
|
|
60
|
+
features of [`pyVHDLModel`][pyVHDLModel-github].
|
|
61
|
+
|
|
62
|
+
A complete breakdown of the current implementation status is available in
|
|
63
|
+
[`docs/IMPLEMENTATION_STATUS.md`](/docs/IMPLEMENTATION_STATUS.md).
|
|
55
64
|
|
|
56
65
|
## Installation
|
|
57
66
|
|
|
@@ -83,10 +92,12 @@ document = pyVHDLModelTreesitter.Document.from_file("path/to/file.vhd")
|
|
|
83
92
|
|
|
84
93
|
Detailed documentation is available for [`pyVHDLModel`][pyVHDLModel-documentation].
|
|
85
94
|
|
|
86
|
-
A complete list of public API endpoints is in [
|
|
95
|
+
A complete list of public API endpoints is in [`docs/API.md`](docs/API.md).
|
|
87
96
|
|
|
88
97
|
## Setup for Development
|
|
89
98
|
|
|
99
|
+
See [`CONTRIBUTING.md`](CONTRIBUTING.md) for the full contribution guide.
|
|
100
|
+
|
|
90
101
|
### Dependencies
|
|
91
102
|
|
|
92
103
|
Developers aiming to contribute to this repository need the following tools:
|
|
@@ -10,8 +10,13 @@
|
|
|
10
10
|
[`pyVHDLModel`][pyVHDLModel-github] API using
|
|
11
11
|
[`tree-sitter-vhdl`][tree-sitter-vhdl].
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
## Implementation Status Disclaimer
|
|
14
|
+
|
|
15
|
+
This project is in early development and only implements a fraction of the
|
|
16
|
+
features of [`pyVHDLModel`][pyVHDLModel-github].
|
|
17
|
+
|
|
18
|
+
A complete breakdown of the current implementation status is available in
|
|
19
|
+
[`docs/IMPLEMENTATION_STATUS.md`](/docs/IMPLEMENTATION_STATUS.md).
|
|
15
20
|
|
|
16
21
|
## Installation
|
|
17
22
|
|
|
@@ -43,10 +48,12 @@ document = pyVHDLModelTreesitter.Document.from_file("path/to/file.vhd")
|
|
|
43
48
|
|
|
44
49
|
Detailed documentation is available for [`pyVHDLModel`][pyVHDLModel-documentation].
|
|
45
50
|
|
|
46
|
-
A complete list of public API endpoints is in [
|
|
51
|
+
A complete list of public API endpoints is in [`docs/API.md`](docs/API.md).
|
|
47
52
|
|
|
48
53
|
## Setup for Development
|
|
49
54
|
|
|
55
|
+
See [`CONTRIBUTING.md`](CONTRIBUTING.md) for the full contribution guide.
|
|
56
|
+
|
|
50
57
|
### Dependencies
|
|
51
58
|
|
|
52
59
|
Developers aiming to contribute to this repository need the following tools:
|
|
@@ -4,16 +4,18 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "pyVHDLModelTreesitter"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.10.0"
|
|
8
8
|
description = "An implementation of pyVHDLModel using treesitter"
|
|
9
9
|
readme = "README.md"
|
|
10
|
+
license = "Apache-2.0"
|
|
11
|
+
license-files = ["LICENSE"]
|
|
10
12
|
requires-python = ">=3.11"
|
|
11
13
|
dependencies = [
|
|
12
14
|
"pyVHDLModel >= 0.38.0",
|
|
13
15
|
"rich >= 11.0.0",
|
|
14
16
|
"pygments >= 2.20.0", # forced to avoid CVE
|
|
15
17
|
"tree-sitter >= 0.23.0",
|
|
16
|
-
"tree-sitter-vhdl >=
|
|
18
|
+
"tree-sitter-vhdl >= 2.0.0",
|
|
17
19
|
]
|
|
18
20
|
authors = [
|
|
19
21
|
{ name = "Dominic Adam Walters" },
|
|
@@ -21,7 +23,7 @@ authors = [
|
|
|
21
23
|
keywords = ["language", "model", "treesitter", "vhdl"]
|
|
22
24
|
classifiers = [
|
|
23
25
|
"Development Status :: 3 - Alpha",
|
|
24
|
-
"License :: OSI Approved ::
|
|
26
|
+
"License :: OSI Approved :: Apache Software License",
|
|
25
27
|
"Programming Language :: Python :: 3 :: Only",
|
|
26
28
|
"Programming Language :: Python :: 3.11",
|
|
27
29
|
"Programming Language :: Python :: 3.12",
|
|
@@ -32,21 +34,24 @@ classifiers = [
|
|
|
32
34
|
|
|
33
35
|
[project.optional-dependencies]
|
|
34
36
|
dev = [
|
|
35
|
-
"
|
|
36
|
-
"
|
|
37
|
+
"codespell >= 2.4.3",
|
|
38
|
+
"coverage >= 7.15.4",
|
|
39
|
+
"git-cliff >= 2.13.1",
|
|
40
|
+
"hatch >= 1.18.0",
|
|
37
41
|
"cryptography >= 49.0.0", # forced to avoid CVE
|
|
38
42
|
"idna >= 3.18", # forced to avoid CVE
|
|
39
43
|
"jaraco-context >= 6.1.2", # forced to avoid CVE
|
|
40
|
-
"mypy >= 2.3.
|
|
41
|
-
"pre-commit >= 4.6.
|
|
44
|
+
"mypy >= 2.3.1",
|
|
45
|
+
"pre-commit >= 4.6.2",
|
|
42
46
|
"pytest >= 9.1.1",
|
|
43
47
|
"pytest-cov >= 7.1.0",
|
|
44
48
|
"pytest-order >= 1.5.0",
|
|
45
49
|
"pytest-sugar >= 1.1.1",
|
|
46
50
|
"pytest-xdist >= 3.8.0",
|
|
47
|
-
"ruff >= 0.16.
|
|
48
|
-
"ty >= 0.0.
|
|
49
|
-
"uv >= 0.12.
|
|
51
|
+
"ruff >= 0.16.4",
|
|
52
|
+
"ty >= 0.0.74",
|
|
53
|
+
"uv >= 0.12.5",
|
|
54
|
+
"vsg >= 3.35.0",
|
|
50
55
|
]
|
|
51
56
|
|
|
52
57
|
[project.urls]
|
|
@@ -54,6 +59,8 @@ Repository = "https://gitlab.com/dawalters/pyVHDLModelTreesitter"
|
|
|
54
59
|
|
|
55
60
|
[tool.codespell]
|
|
56
61
|
ignore-words-list = "inout"
|
|
62
|
+
# CHANGELOG.md quotes historical commit messages verbatim
|
|
63
|
+
exclude-file = "CHANGELOG.md"
|
|
57
64
|
|
|
58
65
|
[tool.coverage.html]
|
|
59
66
|
directory = ".htmlcov"
|
|
@@ -63,9 +70,15 @@ exclude_also = [
|
|
|
63
70
|
"@overload",
|
|
64
71
|
"if TYPE_CHECKING:",
|
|
65
72
|
]
|
|
73
|
+
omit = [
|
|
74
|
+
"src/pyVHDLModelTreesitter/queries/_generated_queries.py",
|
|
75
|
+
]
|
|
66
76
|
|
|
67
77
|
[tool.coverage.run]
|
|
68
78
|
branch = true
|
|
79
|
+
omit = [
|
|
80
|
+
"src/pyVHDLModelTreesitter/queries/_generated_queries.py",
|
|
81
|
+
]
|
|
69
82
|
|
|
70
83
|
[tool.coverage.xml]
|
|
71
84
|
output = ".coverage.xml"
|
|
@@ -96,11 +109,15 @@ strict = true
|
|
|
96
109
|
warn_unreachable = true
|
|
97
110
|
|
|
98
111
|
[tool.pytest.ini_options]
|
|
99
|
-
addopts = "--capture=fd -n auto --dist loadgroup --cov=pyVHDLModelTreesitter --cov-report html --cov-report xml --verbose --junitxml=.junit.xml -o junit_family=legacy"
|
|
112
|
+
addopts = "--capture=fd -n auto --dist loadgroup --strict-markers --cov=pyVHDLModelTreesitter --cov-report html --cov-report xml --verbose --junitxml=.junit.xml -o junit_family=legacy"
|
|
100
113
|
norecursedirs = "oss/*"
|
|
101
114
|
testpaths = [
|
|
102
115
|
"tests",
|
|
103
116
|
]
|
|
117
|
+
markers = [
|
|
118
|
+
"order: control test execution order relative to other tests (pytest-order)",
|
|
119
|
+
"xdist_group: run tests in the same group on the same xdist worker",
|
|
120
|
+
]
|
|
104
121
|
|
|
105
122
|
[tool.ruff]
|
|
106
123
|
unsafe-fixes = true
|
|
@@ -141,6 +158,11 @@ required-imports = ["from __future__ import annotations"]
|
|
|
141
158
|
"tests/**/*.py" = ["S101"]
|
|
142
159
|
"tests/examples/local/**/*.py" = ["D100", "D103", "INP001", "TID252"]
|
|
143
160
|
|
|
161
|
+
[tool.ty.src]
|
|
162
|
+
exclude = [
|
|
163
|
+
"tests/examples/oss/**",
|
|
164
|
+
]
|
|
165
|
+
|
|
144
166
|
[tool.ty.rules]
|
|
145
167
|
all = "error"
|
|
146
168
|
missing-override-decorator = "ignore" # this is emitted for every dunder override
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Submodule mirroring modified aspects of pyVHDLModel.Declaration.
|
|
3
|
+
|
|
4
|
+
The :class:`Alias` class is overridden to add support for the signature that
|
|
5
|
+
:class:`pyVHDLModel.Declaration.Alias` does not model.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
# ruff: file-ignore[invalid-argument-name, mixed-case-variable-in-class-scope, undocumented-public-init]
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
__all__ = [
|
|
13
|
+
"Alias",
|
|
14
|
+
"AliasSignature",
|
|
15
|
+
]
|
|
16
|
+
|
|
17
|
+
from typing import TYPE_CHECKING
|
|
18
|
+
|
|
19
|
+
import pyVHDLModel
|
|
20
|
+
from pyVHDLModel.Declaration import Alias as Alias_VHDLModel
|
|
21
|
+
|
|
22
|
+
if TYPE_CHECKING:
|
|
23
|
+
from pyVHDLModel.Base import ModelEntity
|
|
24
|
+
from pyVHDLModel.Symbol import SimpleSubtypeSymbol
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class AliasSignature(pyVHDLModel.Base.ModelEntity):
|
|
28
|
+
"""
|
|
29
|
+
Represents a signature in an alias declaration.
|
|
30
|
+
|
|
31
|
+
A signature is used to disambiguate overloaded subprograms and enumeration
|
|
32
|
+
literals, and has the form ``[ type_mark { , type_mark } [ return type_mark ] ]``.
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
_parameters: list[SimpleSubtypeSymbol]
|
|
36
|
+
_returnType: SimpleSubtypeSymbol | None
|
|
37
|
+
|
|
38
|
+
def __init__(
|
|
39
|
+
self,
|
|
40
|
+
parameters: list[SimpleSubtypeSymbol],
|
|
41
|
+
returnType: SimpleSubtypeSymbol | None = None,
|
|
42
|
+
parent: ModelEntity | None = None,
|
|
43
|
+
) -> None:
|
|
44
|
+
super().__init__(parent)
|
|
45
|
+
self._parameters = parameters
|
|
46
|
+
self._returnType = returnType
|
|
47
|
+
|
|
48
|
+
@property
|
|
49
|
+
# ruff: ignore[invalid-function-name, undocumented-public-method]
|
|
50
|
+
def Parameters(self) -> list[SimpleSubtypeSymbol]:
|
|
51
|
+
return self._parameters
|
|
52
|
+
|
|
53
|
+
@property
|
|
54
|
+
# ruff: ignore[invalid-function-name, undocumented-public-method]
|
|
55
|
+
def ReturnType(self) -> SimpleSubtypeSymbol | None:
|
|
56
|
+
return self._returnType
|
|
57
|
+
|
|
58
|
+
def __str__(self) -> str: # ruff: ignore[undocumented-magic-method]
|
|
59
|
+
parameters = ", ".join(str(parameter) for parameter in self._parameters)
|
|
60
|
+
result = "["
|
|
61
|
+
if parameters:
|
|
62
|
+
result += f" {parameters}"
|
|
63
|
+
if self._returnType is not None:
|
|
64
|
+
result += f" return {self._returnType}"
|
|
65
|
+
return f"{result} ]"
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
class Alias(Alias_VHDLModel):
|
|
69
|
+
"""An alias declaration with optional signature support."""
|
|
70
|
+
|
|
71
|
+
_signature: AliasSignature | None
|
|
72
|
+
|
|
73
|
+
# ruff: ignore[too-many-arguments, too-many-positional-arguments]
|
|
74
|
+
def __init__(
|
|
75
|
+
self,
|
|
76
|
+
identifier: str,
|
|
77
|
+
name: pyVHDLModel.Symbol.Symbol,
|
|
78
|
+
subtype: pyVHDLModel.Symbol.SubtypeSymbol | None = None,
|
|
79
|
+
signature: AliasSignature | None = None,
|
|
80
|
+
documentation: str = "",
|
|
81
|
+
parent: ModelEntity | None = None,
|
|
82
|
+
) -> None:
|
|
83
|
+
super().__init__(identifier, name, subtype, documentation, parent)
|
|
84
|
+
self._signature = signature
|
|
85
|
+
if signature is not None:
|
|
86
|
+
signature.Parent = self
|
|
87
|
+
|
|
88
|
+
@property
|
|
89
|
+
# ruff: ignore[invalid-function-name, undocumented-public-method]
|
|
90
|
+
def Signature(self) -> AliasSignature | None:
|
|
91
|
+
return self._signature
|
|
92
|
+
|
|
93
|
+
def __str__(self) -> str: # ruff: ignore[undocumented-magic-method]
|
|
94
|
+
subtype = f" : {self._subtype}" if self._subtype is not None else ""
|
|
95
|
+
signature = f" {self._signature}" if self._signature is not None else ""
|
|
96
|
+
return f"alias {self._identifier}{subtype} is {self._name}{signature}"
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Submodule mirroring modified aspects of pyVHDLModel.Object.
|
|
3
|
+
|
|
4
|
+
The :class:`File` class is overridden to add support for the file open
|
|
5
|
+
information that :class:`pyVHDLModel.Object.File` does not model.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
__all__ = [
|
|
11
|
+
"File",
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
from typing import TYPE_CHECKING
|
|
15
|
+
|
|
16
|
+
import pyVHDLModel
|
|
17
|
+
|
|
18
|
+
if TYPE_CHECKING:
|
|
19
|
+
from pyVHDLModel.Base import ModelEntity
|
|
20
|
+
from pyVHDLModel.Expression import EnumerationLiteral, StringLiteral
|
|
21
|
+
from pyVHDLModel.Symbol import Symbol
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class File(pyVHDLModel.Object.File):
|
|
25
|
+
"""A file declaration with optional file open information."""
|
|
26
|
+
|
|
27
|
+
_fileOpenKind: EnumerationLiteral | None # ruff: ignore[mixed-case-variable-in-class-scope]
|
|
28
|
+
_fileLogicalName: StringLiteral | None # ruff: ignore[mixed-case-variable-in-class-scope]
|
|
29
|
+
|
|
30
|
+
# ruff: ignore[too-many-arguments, too-many-positional-arguments, undocumented-public-init]
|
|
31
|
+
def __init__(
|
|
32
|
+
self,
|
|
33
|
+
identifiers: list[str],
|
|
34
|
+
subtype: Symbol,
|
|
35
|
+
fileOpenKind: EnumerationLiteral | None = None, # ruff: ignore[invalid-argument-name]
|
|
36
|
+
fileLogicalName: StringLiteral | None = None, # ruff: ignore[invalid-argument-name]
|
|
37
|
+
documentation: str = "",
|
|
38
|
+
parent: ModelEntity | None = None,
|
|
39
|
+
) -> None:
|
|
40
|
+
super().__init__(identifiers, subtype, documentation, parent)
|
|
41
|
+
self._fileOpenKind = fileOpenKind
|
|
42
|
+
self._fileLogicalName = fileLogicalName
|
|
43
|
+
|
|
44
|
+
@property
|
|
45
|
+
# ruff: ignore[invalid-function-name, undocumented-public-method]
|
|
46
|
+
def fileOpenKind(self) -> EnumerationLiteral | None:
|
|
47
|
+
return self._fileOpenKind
|
|
48
|
+
|
|
49
|
+
@property
|
|
50
|
+
# ruff: ignore[invalid-function-name, undocumented-public-method]
|
|
51
|
+
def fileLogicalName(self) -> StringLiteral | None:
|
|
52
|
+
return self._fileLogicalName
|
|
@@ -10,15 +10,10 @@ from typing import TYPE_CHECKING, TypeVar
|
|
|
10
10
|
|
|
11
11
|
from pyVHDLModel.Association import AssociationItem
|
|
12
12
|
from pyVHDLModel.Name import OpenName
|
|
13
|
-
from pyVHDLModel.Symbol import SignalSymbol
|
|
14
13
|
|
|
15
14
|
from pyVHDLModelTreesitter._Name import parse_name
|
|
16
|
-
from pyVHDLModelTreesitter.queries import
|
|
17
|
-
from pyVHDLModelTreesitter.
|
|
18
|
-
from pyVHDLModelTreesitter.queries._utils import (
|
|
19
|
-
get_node,
|
|
20
|
-
get_node_text,
|
|
21
|
-
)
|
|
15
|
+
from pyVHDLModelTreesitter.queries import AssociationElementQuery
|
|
16
|
+
from pyVHDLModelTreesitter.treesitter import get_node_text, inject_node
|
|
22
17
|
|
|
23
18
|
if TYPE_CHECKING:
|
|
24
19
|
import pyVHDLModel
|
|
@@ -30,23 +25,22 @@ T = TypeVar("T", bound=AssociationItem)
|
|
|
30
25
|
|
|
31
26
|
def parse_association_item(cls: type[T], node: tree_sitter.Node) -> T | None:
|
|
32
27
|
"""Create an AssociationItem from a tree-sitter node."""
|
|
33
|
-
captures =
|
|
34
|
-
formal_node = get_node(node,
|
|
28
|
+
captures = AssociationElementQuery.capture_first_root(node)
|
|
29
|
+
formal_node = captures.get_node(node, "formal", optional=True)
|
|
35
30
|
formal = None
|
|
36
31
|
if formal_node is not None:
|
|
37
|
-
formal =
|
|
38
|
-
actual_node = get_node(node,
|
|
32
|
+
formal = parse_name(get_node_text(formal_node))
|
|
33
|
+
actual_node = captures.get_node(node, "actual")
|
|
39
34
|
actual: pyVHDLModel.Base.ExpressionUnion
|
|
40
35
|
if actual_node.type == "OPEN":
|
|
41
36
|
actual = OpenName()
|
|
42
37
|
else:
|
|
43
38
|
# ruff: ignore[import-outside-top-level]
|
|
44
|
-
from pyVHDLModelTreesitter.
|
|
39
|
+
from pyVHDLModelTreesitter._Expression import parse_conditional_expression
|
|
45
40
|
|
|
46
41
|
actual = parse_conditional_expression(actual_node)
|
|
47
42
|
if actual is None:
|
|
48
43
|
return None
|
|
49
|
-
# TODO: `formal` is a `SignalSymbol`, is this correct?
|
|
50
44
|
# TODO: `OpenName` might need wrapping in a `Symbol`
|
|
51
45
|
# ty: ignore[invalid-argument-type]
|
|
52
46
|
ret = cls(formal, actual) # type: ignore[arg-type]
|
{pyvhdlmodeltreesitter-0.9.0 → pyvhdlmodeltreesitter-0.10.0}/src/pyVHDLModelTreesitter/_Base.py
RENAMED
|
@@ -5,19 +5,27 @@ from __future__ import annotations
|
|
|
5
5
|
__all__ = [
|
|
6
6
|
"parse_direction",
|
|
7
7
|
"parse_mode",
|
|
8
|
+
"parse_range_attribute",
|
|
8
9
|
"parse_simple_range",
|
|
9
10
|
"parse_waveform_element",
|
|
11
|
+
"parse_waveform_elements",
|
|
10
12
|
]
|
|
11
13
|
|
|
12
14
|
from typing import TYPE_CHECKING
|
|
13
15
|
|
|
14
16
|
import pyVHDLModel
|
|
15
|
-
from pyVHDLModel.Base import SimpleRange, WaveformElement
|
|
17
|
+
from pyVHDLModel.Base import RangeFromName, SimpleRange, WaveformElement
|
|
18
|
+
from pyVHDLModel.Name import AttributeName
|
|
19
|
+
from pyVHDLModel.Symbol import RangeAttributeSymbol
|
|
16
20
|
|
|
17
21
|
if TYPE_CHECKING:
|
|
18
22
|
from tree_sitter import Node
|
|
19
23
|
|
|
20
|
-
from pyVHDLModelTreesitter.
|
|
24
|
+
from pyVHDLModelTreesitter._Expression import parse_simple_expression
|
|
25
|
+
from pyVHDLModelTreesitter._Name import parse_name
|
|
26
|
+
from pyVHDLModelTreesitter._parse import (
|
|
27
|
+
_parse_enum_string,
|
|
28
|
+
)
|
|
21
29
|
from pyVHDLModelTreesitter.error import (
|
|
22
30
|
NodeExtraChildError,
|
|
23
31
|
NodeMissingChildError,
|
|
@@ -25,12 +33,17 @@ from pyVHDLModelTreesitter.error import (
|
|
|
25
33
|
NodeTextIsNoneError,
|
|
26
34
|
NotImplementedWarning,
|
|
27
35
|
)
|
|
28
|
-
from pyVHDLModelTreesitter.
|
|
36
|
+
from pyVHDLModelTreesitter.treesitter._access import get_node_text
|
|
37
|
+
from pyVHDLModelTreesitter.treesitter._map import inject_node
|
|
29
38
|
|
|
30
39
|
|
|
31
|
-
def parse_direction(
|
|
40
|
+
def parse_direction(node: Node | None) -> pyVHDLModel.Base.Direction | None:
|
|
32
41
|
"""
|
|
33
|
-
Parse a
|
|
42
|
+
Parse a tree-sitter direction node.
|
|
43
|
+
|
|
44
|
+
Extracts the text from a direction node and resolves it to a
|
|
45
|
+
:class:`pyVHDLModel.Base.Direction` enum value. Returns ``None`` if the text
|
|
46
|
+
does not match any known direction.
|
|
34
47
|
|
|
35
48
|
This will accept any mix of the following:
|
|
36
49
|
- Incorrect capitalisation
|
|
@@ -39,19 +52,23 @@ def parse_direction(string: str) -> pyVHDLModel.Base.Direction | None:
|
|
|
39
52
|
- Split words with whitespace
|
|
40
53
|
- "down to"
|
|
41
54
|
"""
|
|
42
|
-
|
|
43
|
-
string = "".join(string.split()).lower().capitalize()
|
|
44
|
-
if string == "Downto":
|
|
45
|
-
string = "DownTo"
|
|
46
|
-
try:
|
|
47
|
-
return pyVHDLModel.Base.Direction[string]
|
|
48
|
-
except IndexError:
|
|
55
|
+
if node is None:
|
|
49
56
|
return None
|
|
57
|
+
string = get_node_text(node)
|
|
58
|
+
return _parse_enum_string(
|
|
59
|
+
string,
|
|
60
|
+
pyVHDLModel.Base.Direction,
|
|
61
|
+
renames={"Downto": "DownTo"},
|
|
62
|
+
)
|
|
50
63
|
|
|
51
64
|
|
|
52
|
-
def parse_mode(
|
|
65
|
+
def parse_mode(node: Node | None) -> pyVHDLModel.Base.Mode | None:
|
|
53
66
|
"""
|
|
54
|
-
Parse a
|
|
67
|
+
Parse a tree-sitter mode node.
|
|
68
|
+
|
|
69
|
+
Extracts the text from a mode node and resolves it to a
|
|
70
|
+
:class:`pyVHDLModel.Base.Mode` enum value. Returns ``None`` if the text does
|
|
71
|
+
not match any known mode.
|
|
55
72
|
|
|
56
73
|
This will accept any mix of the following:
|
|
57
74
|
- Incorrect capitalisation
|
|
@@ -61,14 +78,60 @@ def parse_mode(string: str) -> pyVHDLModel.Base.Mode | None:
|
|
|
61
78
|
- Split words with whitespace
|
|
62
79
|
- "in out"
|
|
63
80
|
"""
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
81
|
+
if node is None:
|
|
82
|
+
return pyVHDLModel.Base.Mode.In
|
|
83
|
+
string = get_node_text(node)
|
|
84
|
+
parsed = _parse_enum_string(
|
|
85
|
+
string,
|
|
86
|
+
pyVHDLModel.Base.Mode,
|
|
87
|
+
renames={"Inout": "InOut"},
|
|
88
|
+
)
|
|
89
|
+
if parsed is None:
|
|
90
|
+
normalized = "".join(string.split()).lower().capitalize()
|
|
91
|
+
NotImplementedWarning.warn(
|
|
92
|
+
f"'{normalized}' is not a supported interface mode",
|
|
93
|
+
node,
|
|
94
|
+
)
|
|
95
|
+
return parsed
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def parse_range_attribute( # ruff: ignore[complex-structure, too-many-return-statements]
|
|
99
|
+
node: Node,
|
|
100
|
+
) -> RangeFromName | None:
|
|
101
|
+
"""
|
|
102
|
+
Check if a conditional_expression node represents a range attribute.
|
|
103
|
+
|
|
104
|
+
For example, parses ``s'range`` into a `RangeFromName`.
|
|
105
|
+
Returns `None` if the node is not a range attribute.
|
|
106
|
+
"""
|
|
107
|
+
if node.type != "conditional_expression":
|
|
108
|
+
return None
|
|
109
|
+
if node.child_count != 1:
|
|
110
|
+
return None
|
|
111
|
+
simple_expr = node.children[0]
|
|
112
|
+
if simple_expr.type != "simple_expression":
|
|
71
113
|
return None
|
|
114
|
+
if simple_expr.child_count != 1:
|
|
115
|
+
return None
|
|
116
|
+
name_node = simple_expr.children[0]
|
|
117
|
+
if name_node.type != "name":
|
|
118
|
+
return None
|
|
119
|
+
prefix_identifier = None
|
|
120
|
+
has_range_attr = False
|
|
121
|
+
for nc in name_node.children:
|
|
122
|
+
if nc.type == "identifier":
|
|
123
|
+
prefix_identifier = nc
|
|
124
|
+
elif nc.type == "attribute":
|
|
125
|
+
for ac in nc.children:
|
|
126
|
+
if ac.type == "attribute_range":
|
|
127
|
+
has_range_attr = True
|
|
128
|
+
break
|
|
129
|
+
if has_range_attr and prefix_identifier is not None:
|
|
130
|
+
prefix_text = get_node_text(prefix_identifier)
|
|
131
|
+
prefix_name = parse_name(prefix_text)
|
|
132
|
+
attr_name = AttributeName("range", prefix_name)
|
|
133
|
+
return RangeFromName(RangeAttributeSymbol(attr_name))
|
|
134
|
+
return None
|
|
72
135
|
|
|
73
136
|
|
|
74
137
|
def parse_simple_range(node: Node) -> SimpleRange | None: # ruff: ignore[complex-structure, too-many-branches]
|
|
@@ -109,7 +172,6 @@ def parse_simple_range(node: Node) -> SimpleRange | None: # ruff: ignore[comple
|
|
|
109
172
|
return None
|
|
110
173
|
if direction_node.text is None or len(direction_node.text) == 0:
|
|
111
174
|
raise NodeTextIsNoneError(direction_node)
|
|
112
|
-
direction_str = direction_node.text.decode("utf-8")
|
|
113
175
|
right = node.child(2)
|
|
114
176
|
if right is None:
|
|
115
177
|
raise NodeMissingChildError(node, "third-child")
|
|
@@ -124,8 +186,9 @@ def parse_simple_range(node: Node) -> SimpleRange | None: # ruff: ignore[comple
|
|
|
124
186
|
right_expr = parse_simple_expression(right)
|
|
125
187
|
if right_expr is None:
|
|
126
188
|
return None
|
|
127
|
-
direction = parse_direction(
|
|
189
|
+
direction = parse_direction(direction_node)
|
|
128
190
|
if direction is None:
|
|
191
|
+
direction_str = direction_node.text.decode("utf-8")
|
|
129
192
|
raise NodeTextIsInvalidError(
|
|
130
193
|
node,
|
|
131
194
|
f"'{direction_str}' is not a valid VHDL direction",
|
|
@@ -152,3 +215,12 @@ def parse_waveform_element(node: Node) -> WaveformElement | None:
|
|
|
152
215
|
if expression is None:
|
|
153
216
|
return None
|
|
154
217
|
return inject_node(WaveformElement(expression), node)
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
def parse_waveform_elements(node: Node) -> list[WaveformElement]:
|
|
221
|
+
return [
|
|
222
|
+
we
|
|
223
|
+
for child in node.children
|
|
224
|
+
if child.type == "waveform_element"
|
|
225
|
+
if (we := parse_waveform_element(child)) is not None
|
|
226
|
+
]
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"""Submodule defining parsers for classes from pyVHDLModel.Common."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
__all__ = [
|
|
6
|
+
"parse_conditional_waveforms",
|
|
7
|
+
]
|
|
8
|
+
|
|
9
|
+
from typing import TYPE_CHECKING
|
|
10
|
+
|
|
11
|
+
from pyVHDLModel.Common import ConditionalWaveform
|
|
12
|
+
|
|
13
|
+
if TYPE_CHECKING:
|
|
14
|
+
import tree_sitter
|
|
15
|
+
|
|
16
|
+
from pyVHDLModelTreesitter._Base import parse_waveform_elements
|
|
17
|
+
from pyVHDLModelTreesitter._Expression import parse_simple_expression
|
|
18
|
+
from pyVHDLModelTreesitter.queries import ConditionalWaveformsQuery
|
|
19
|
+
from pyVHDLModelTreesitter.treesitter import sort_into_text_order
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def parse_conditional_waveforms(
|
|
23
|
+
node: tree_sitter.Node,
|
|
24
|
+
) -> list[ConditionalWaveform] | None:
|
|
25
|
+
"""Parse a ``conditional_waveforms`` node into a list of ``ConditionalWaveform``."""
|
|
26
|
+
captures = ConditionalWaveformsQuery.capture_first_root(node)
|
|
27
|
+
waveform_node = captures.get_node(node, "waveform")
|
|
28
|
+
condition_nodes = sort_into_text_order(
|
|
29
|
+
captures.get_nodes(node, "when_expression"),
|
|
30
|
+
)
|
|
31
|
+
other_waveform_nodes = sort_into_text_order(
|
|
32
|
+
captures.get_nodes(node, "else_waveform"),
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
result: list[ConditionalWaveform] = []
|
|
36
|
+
|
|
37
|
+
next_waveform_node = waveform_node
|
|
38
|
+
for condition_node, other_waveform_node in zip(
|
|
39
|
+
condition_nodes,
|
|
40
|
+
other_waveform_nodes,
|
|
41
|
+
strict=True,
|
|
42
|
+
):
|
|
43
|
+
waveform = parse_waveform_elements(next_waveform_node)
|
|
44
|
+
if len(waveform) == 0:
|
|
45
|
+
# TODO: message
|
|
46
|
+
return None
|
|
47
|
+
condition = parse_simple_expression(condition_node)
|
|
48
|
+
if condition is None:
|
|
49
|
+
# TODO: message
|
|
50
|
+
return None
|
|
51
|
+
result.append(
|
|
52
|
+
ConditionalWaveform(waveform=waveform, condition=condition),
|
|
53
|
+
)
|
|
54
|
+
next_waveform_node = other_waveform_node
|
|
55
|
+
else_waveform = parse_waveform_elements(next_waveform_node)
|
|
56
|
+
if len(else_waveform) == 0:
|
|
57
|
+
# TODO: message
|
|
58
|
+
return None
|
|
59
|
+
result.append(ConditionalWaveform(waveform=else_waveform, condition=None))
|
|
60
|
+
return result
|