use crate::ast::*; use crate::parser::*; use nom::branch::*; use nom::bytes::complete::*; use nom::combinator::*; use nom::error::*; use nom::multi::*; use nom::sequence::*; use nom::{Err, IResult}; // ----------------------------------------------------------------------------- pub const AZ_: &str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_"; pub const AZ09_: &str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_"; pub const AZ09_DOLLAR: &str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_$"; #[derive(Debug, Node)] pub struct ArrayIdentifier<'a> { pub nodes: (Identifier<'a>,), } #[derive(Debug, Node)] pub struct BlockIdentifier<'a> { pub nodes: (Identifier<'a>,), } #[derive(Debug, Node)] pub struct BinIdentifier<'a> { pub nodes: (Identifier<'a>,), } #[derive(Debug, Node)] pub struct CIdentifier<'a> { pub nodes: (Span<'a>, Vec>), } #[derive(Debug, Node)] pub struct CellIdentifier<'a> { pub nodes: (Identifier<'a>,), } #[derive(Debug, Node)] pub struct CheckerIdentifier<'a> { pub nodes: (Identifier<'a>,), } #[derive(Debug, Node)] pub struct ClassIdentifier<'a> { pub nodes: (Identifier<'a>,), } #[derive(Debug, Node)] pub struct ClassVariableIdentifier<'a> { pub nodes: (VariableIdentifier<'a>,), } #[derive(Debug, Node)] pub struct ClockingIdentifier<'a> { pub nodes: (Identifier<'a>,), } #[derive(Debug, Node)] pub struct ConfigIdentifier<'a> { pub nodes: (Identifier<'a>,), } #[derive(Debug, Node)] pub struct ConstIdentifier<'a> { pub nodes: (Identifier<'a>,), } #[derive(Debug, Node)] pub struct ConstraintIdentifier<'a> { pub nodes: (Identifier<'a>,), } #[derive(Debug, Node)] pub struct CovergroupIdentifier<'a> { pub nodes: (Identifier<'a>,), } #[derive(Debug, Node)] pub struct CovergroupVariableIdentifier<'a> { pub nodes: (VariableIdentifier<'a>,), } #[derive(Debug, Node)] pub struct CoverPointIdentifier<'a> { pub nodes: (Identifier<'a>,), } #[derive(Debug, Node)] pub struct CrossIdentifier<'a> { pub nodes: (Identifier<'a>,), } #[derive(Debug, Node)] pub struct DynamicArrayVariableIdentifier<'a> { pub nodes: (VariableIdentifier<'a>,), } #[derive(Debug, Node)] pub struct EnumIdentifier<'a> { pub nodes: (Identifier<'a>,), } #[derive(Debug, Node)] pub struct EscapedIdentifier<'a> { pub nodes: (Span<'a>, Vec>), } #[derive(Debug, Node)] pub struct FormalIdentifier<'a> { pub nodes: (Identifier<'a>,), } #[derive(Debug, Node)] pub struct FormalPortIdentifier<'a> { pub nodes: (Identifier<'a>,), } #[derive(Debug, Node)] pub struct FunctionIdentifier<'a> { pub nodes: (Identifier<'a>,), } #[derive(Debug, Node)] pub struct GenerateBlockIdentifier<'a> { pub nodes: (Identifier<'a>,), } #[derive(Debug, Node)] pub struct GenvarIdentifier<'a> { pub nodes: (Identifier<'a>,), } #[derive(Debug, Node)] pub struct HierarchicalArrayIdentifier<'a> { pub nodes: (HierarchicalIdentifier<'a>,), } #[derive(Debug, Node)] pub struct HierarchicalBlockIdentifier<'a> { pub nodes: (HierarchicalIdentifier<'a>,), } #[derive(Debug, Node)] pub struct HierarchicalEventIdentifier<'a> { pub nodes: (HierarchicalIdentifier<'a>,), } #[derive(Debug, Node)] pub struct HierarchicalIdentifier<'a> { pub nodes: ( Option>, Vec<(Identifier<'a>, ConstantBitSelect<'a>, Symbol<'a>)>, Identifier<'a>, ), } #[derive(Debug, Node)] pub struct Root<'a> { pub nodes: (Symbol<'a>, Symbol<'a>), } #[derive(Debug, Node)] pub struct HierarchicalNetIdentifier<'a> { pub nodes: (HierarchicalIdentifier<'a>,), } #[derive(Debug, Node)] pub struct HierarchicalParameterIdentifier<'a> { pub nodes: (HierarchicalIdentifier<'a>,), } #[derive(Debug, Node)] pub struct HierarchicalPropertyIdentifier<'a> { pub nodes: (HierarchicalIdentifier<'a>,), } #[derive(Debug, Node)] pub struct HierarchicalSequenceIdentifier<'a> { pub nodes: (HierarchicalIdentifier<'a>,), } #[derive(Debug, Node)] pub struct HierarchicalTaskIdentifier<'a> { pub nodes: (HierarchicalIdentifier<'a>,), } #[derive(Debug, Node)] pub struct HierarchicalTfIdentifier<'a> { pub nodes: (HierarchicalIdentifier<'a>,), } #[derive(Debug, Node)] pub struct HierarchicalVariableIdentifier<'a> { pub nodes: (HierarchicalIdentifier<'a>,), } #[derive(Debug, Node)] pub enum Identifier<'a> { SimpleIdentifier(SimpleIdentifier<'a>), EscapedIdentifier(EscapedIdentifier<'a>), } #[derive(Debug, Node)] pub struct IndexVariableIdentifier<'a> { pub nodes: (Identifier<'a>,), } #[derive(Debug, Node)] pub struct InterfaceIdentifier<'a> { pub nodes: (Identifier<'a>,), } #[derive(Debug, Node)] pub struct InterfaceInstanceIdentifier<'a> { pub nodes: (Identifier<'a>,), } #[derive(Debug, Node)] pub struct InoutPortIdentifier<'a> { pub nodes: (Identifier<'a>,), } #[derive(Debug, Node)] pub struct InputPortIdentifier<'a> { pub nodes: (Identifier<'a>,), } #[derive(Debug, Node)] pub struct InstanceIdentifier<'a> { pub nodes: (Identifier<'a>,), } #[derive(Debug, Node)] pub struct LibraryIdentifier<'a> { pub nodes: (Identifier<'a>,), } #[derive(Debug, Node)] pub struct MemberIdentifier<'a> { pub nodes: (Identifier<'a>,), } #[derive(Debug, Node)] pub struct MethodIdentifier<'a> { pub nodes: (Identifier<'a>,), } #[derive(Debug, Node)] pub struct ModportIdentifier<'a> { pub nodes: (Identifier<'a>,), } #[derive(Debug, Node)] pub struct ModuleIdentifier<'a> { pub nodes: (Identifier<'a>,), } #[derive(Debug, Node)] pub struct NetIdentifier<'a> { pub nodes: (Identifier<'a>,), } #[derive(Debug, Node)] pub struct NetTypeIdentifier<'a> { pub nodes: (Identifier<'a>,), } #[derive(Debug, Node)] pub struct OutputPortIdentifier<'a> { pub nodes: (Identifier<'a>,), } #[derive(Debug, Node)] pub struct PackageIdentifier<'a> { pub nodes: (Identifier<'a>,), } #[derive(Debug, Node)] pub enum PackageScope<'a> { Package(PackageScopePackage<'a>), Unit(Unit<'a>), } #[derive(Debug, Node)] pub struct PackageScopePackage<'a> { pub nodes: (PackageIdentifier<'a>, Symbol<'a>), } #[derive(Debug, Node)] pub struct Unit<'a> { pub nodes: (Symbol<'a>, Symbol<'a>), } #[derive(Debug, Node)] pub struct ParameterIdentifier<'a> { pub nodes: (Identifier<'a>,), } #[derive(Debug, Node)] pub struct PortIdentifier<'a> { pub nodes: (Identifier<'a>,), } #[derive(Debug, Node)] pub struct ProductionIdentifier<'a> { pub nodes: (Identifier<'a>,), } #[derive(Debug, Node)] pub struct ProgramIdentifier<'a> { pub nodes: (Identifier<'a>,), } #[derive(Debug, Node)] pub struct PropertyIdentifier<'a> { pub nodes: (Identifier<'a>,), } #[derive(Debug, Node)] pub struct PsClassIdentifier<'a> { pub nodes: (Option>, ClassIdentifier<'a>), } #[derive(Debug, Node)] pub struct PsCovergroupIdentifier<'a> { pub nodes: (Option>, CovergroupIdentifier<'a>), } #[derive(Debug, Node)] pub struct PsCheckerIdentifier<'a> { pub nodes: (Option>, CheckerIdentifier<'a>), } #[derive(Debug, Node)] pub struct PsIdentifier<'a> { pub nodes: (Option>, Identifier<'a>), } #[derive(Debug, Node)] pub struct PsOrHierarchicalArrayIdentifier<'a> { pub nodes: ( Option>, HierarchicalArrayIdentifier<'a>, ), } #[derive(Debug, Node)] pub enum PsOrHierarchicalNetIdentifier<'a> { PackageScope(PsOrHierarchicalNetIdentifierPackageScope<'a>), HierarchicalNetIdentifier(HierarchicalNetIdentifier<'a>), } #[derive(Debug, Node)] pub struct PsOrHierarchicalNetIdentifierPackageScope<'a> { pub nodes: (Option>, NetIdentifier<'a>), } #[derive(Debug, Node)] pub struct PsOrHierarchicalNetIdentifierHierarchical<'a> { pub nodes: (HierarchicalNetIdentifier<'a>), } #[derive(Debug, Node)] pub enum PsOrHierarchicalPropertyIdentifier<'a> { PackageScope(PsOrHierarchicalPropertyIdentifierPackageScope<'a>), HierarchicalPropertyIdentifier(HierarchicalPropertyIdentifier<'a>), } #[derive(Debug, Node)] pub struct PsOrHierarchicalPropertyIdentifierPackageScope<'a> { pub nodes: (Option>, PropertyIdentifier<'a>), } #[derive(Debug, Node)] pub struct PsOrHierarchicalPropertyIdentifierHierarchical<'a> { pub nodes: (HierarchicalPropertyIdentifier<'a>), } #[derive(Debug, Node)] pub enum PsOrHierarchicalSequenceIdentifier<'a> { PackageScope(PsOrHierarchicalSequenceIdentifierPackageScope<'a>), HierarchicalSequenceIdentifier(HierarchicalSequenceIdentifier<'a>), } #[derive(Debug, Node)] pub struct PsOrHierarchicalSequenceIdentifierPackageScope<'a> { pub nodes: (Option>, SequenceIdentifier<'a>), } #[derive(Debug, Node)] pub struct PsOrHierarchicalSequenceIdentifierHierarchical<'a> { pub nodes: (HierarchicalSequenceIdentifier<'a>), } #[derive(Debug, Node)] pub enum PsOrHierarchicalTfIdentifier<'a> { PackageScope(PsOrHierarchicalTfIdentifierPackageScope<'a>), HierarchicalTfIdentifier(HierarchicalTfIdentifier<'a>), } #[derive(Debug, Node)] pub struct PsOrHierarchicalTfIdentifierPackageScope<'a> { pub nodes: (Option>, TfIdentifier<'a>), } #[derive(Debug, Node)] pub struct PsOrHierarchicalTfIdentifierHierarchical<'a> { pub nodes: (HierarchicalTfIdentifier<'a>), } #[derive(Debug, Node)] pub enum PsParameterIdentifier<'a> { Scope(PsParameterIdentifierScope<'a>), Generate(PsParameterIdentifierGenerate<'a>), } #[derive(Debug, Node)] pub struct PsParameterIdentifierScope<'a> { pub nodes: ( Option>, ParameterIdentifier<'a>, ), } #[derive(Debug, Node)] pub struct PsParameterIdentifierGenerate<'a> { pub nodes: ( Vec<( GenerateBlockIdentifier<'a>, Option>>, Symbol<'a>, )>, ParameterIdentifier<'a>, ), } #[derive(Debug, Node)] pub struct PsTypeIdentifier<'a> { pub nodes: ( Option>, TypeIdentifier<'a>, ), } #[derive(Debug, Node)] pub enum LocalOrPackageScopeOrClassScope<'a> { Local(Local<'a>), PackageScope(PackageScope<'a>), ClassScope(ClassScope<'a>), } #[derive(Debug, Node)] pub struct Local<'a> { pub nodes: (Symbol<'a>, Symbol<'a>), } #[derive(Debug, Node)] pub struct SequenceIdentifier<'a> { pub nodes: (Identifier<'a>,), } #[derive(Debug, Node)] pub struct SignalIdentifier<'a> { pub nodes: (Identifier<'a>,), } #[derive(Debug, Node)] pub struct SimpleIdentifier<'a> { pub nodes: (Span<'a>, Vec>), } #[derive(Debug, Node)] pub struct SpecparamIdentifier<'a> { pub nodes: (Identifier<'a>,), } #[derive(Debug, Node)] pub struct SystemTfIdentifier<'a> { pub nodes: (Span<'a>, Vec>), } #[derive(Debug, Node)] pub struct TaskIdentifier<'a> { pub nodes: (Identifier<'a>,), } #[derive(Debug, Node)] pub struct TfIdentifier<'a> { pub nodes: (Identifier<'a>,), } #[derive(Debug, Node)] pub struct TerminalIdentifier<'a> { pub nodes: (Identifier<'a>,), } #[derive(Debug, Node)] pub struct TopmoduleIdentifier<'a> { pub nodes: (Identifier<'a>,), } #[derive(Debug, Node)] pub struct TypeIdentifier<'a> { pub nodes: (Identifier<'a>,), } #[derive(Debug, Node)] pub struct UdpIdentifier<'a> { pub nodes: (Identifier<'a>,), } #[derive(Debug, Node)] pub struct VariableIdentifier<'a> { pub nodes: (Identifier<'a>,), } #[derive(Debug, Node)] pub enum ImplicitClassHandleOrClassScopeOrPackageScope<'a> { ImplicitClassHandle((ImplicitClassHandle<'a>, Symbol<'a>)), ClassScope(ClassScope<'a>), PackageScope(PackageScope<'a>), } #[derive(Debug, Node)] pub enum ImplicitClassHandleOrPackageScope<'a> { ImplicitClassHandle((ImplicitClassHandle<'a>, Symbol<'a>)), PackageScope(PackageScope<'a>), } #[derive(Debug, Node)] pub enum ImplicitClassHandleOrClassScope<'a> { ImplicitClassHandle((ImplicitClassHandle<'a>, Symbol<'a>)), ClassScope(ClassScope<'a>), } #[derive(Debug, Node)] pub enum PackageScopeOrClassScope<'a> { PackageScope(PackageScope<'a>), ClassScope(ClassScope<'a>), } // ----------------------------------------------------------------------------- #[parser] pub fn array_identifier(s: Span) -> IResult { let (s, a) = identifier(s)?; Ok((s, ArrayIdentifier { nodes: (a,) })) } #[parser] pub fn block_identifier(s: Span) -> IResult { let (s, a) = identifier(s)?; Ok((s, BlockIdentifier { nodes: (a,) })) } #[parser] pub fn bin_identifier(s: Span) -> IResult { let (s, a) = identifier(s)?; Ok((s, BinIdentifier { nodes: (a,) })) } #[parser] pub fn c_identifier(s: Span) -> IResult { let (s, a) = ws(c_identifier_impl)(s)?; Ok((s, CIdentifier { nodes: a })) } #[parser] pub fn c_identifier_impl(s: Span) -> IResult { let (s, a) = is_a(AZ_)(s)?; let (s, b) = opt(is_a(AZ09_))(s)?; let a = if let Some(b) = b { concat(a, b).unwrap() } else { a }; if is_keyword(&a) { Err(Err::Error(make_error(s, ErrorKind::Fix))) } else { Ok((s, a)) } } #[parser] pub fn cell_identifier(s: Span) -> IResult { let (s, a) = identifier(s)?; Ok((s, CellIdentifier { nodes: (a,) })) } #[parser] pub fn checker_identifier(s: Span) -> IResult { let (s, a) = identifier(s)?; Ok((s, CheckerIdentifier { nodes: (a,) })) } #[parser] pub fn class_identifier(s: Span) -> IResult { let (s, a) = identifier(s)?; Ok((s, ClassIdentifier { nodes: (a,) })) } #[parser] pub fn class_variable_identifier(s: Span) -> IResult { let (s, a) = variable_identifier(s)?; Ok((s, ClassVariableIdentifier { nodes: (a,) })) } #[parser] pub fn clocking_identifier(s: Span) -> IResult { let (s, a) = identifier(s)?; Ok((s, ClockingIdentifier { nodes: (a,) })) } #[parser] pub fn config_identifier(s: Span) -> IResult { let (s, a) = identifier(s)?; Ok((s, ConfigIdentifier { nodes: (a,) })) } #[parser] pub fn const_identifier(s: Span) -> IResult { let (s, a) = identifier(s)?; Ok((s, ConstIdentifier { nodes: (a,) })) } #[parser] pub fn constraint_identifier(s: Span) -> IResult { let (s, a) = identifier(s)?; Ok((s, ConstraintIdentifier { nodes: (a,) })) } #[parser] pub fn covergroup_identifier(s: Span) -> IResult { let (s, a) = identifier(s)?; Ok((s, CovergroupIdentifier { nodes: (a,) })) } #[parser] pub fn covergroup_variable_identifier(s: Span) -> IResult { let (s, a) = variable_identifier(s)?; Ok((s, CovergroupVariableIdentifier { nodes: (a,) })) } #[parser] pub fn cover_point_identifier(s: Span) -> IResult { let (s, a) = identifier(s)?; Ok((s, CoverPointIdentifier { nodes: (a,) })) } #[parser] pub fn cross_identifier(s: Span) -> IResult { let (s, a) = identifier(s)?; Ok((s, CrossIdentifier { nodes: (a,) })) } #[parser] pub fn dynamic_array_variable_identifier(s: Span) -> IResult { let (s, a) = variable_identifier(s)?; Ok((s, DynamicArrayVariableIdentifier { nodes: (a,) })) } #[parser] pub fn enum_identifier(s: Span) -> IResult { let (s, a) = identifier(s)?; Ok((s, EnumIdentifier { nodes: (a,) })) } #[parser] pub fn escaped_identifier(s: Span) -> IResult { let (s, a) = ws(escaped_identifier_impl)(s)?; Ok((s, EscapedIdentifier { nodes: a })) } #[parser] pub fn escaped_identifier_impl(s: Span) -> IResult { let (s, a) = tag("\\")(s)?; let (s, b) = is_not(" \t\r\n")(s)?; let a = concat(a, b).unwrap(); Ok((s, a)) } #[parser] pub fn formal_identifier(s: Span) -> IResult { let (s, a) = identifier(s)?; Ok((s, FormalIdentifier { nodes: (a,) })) } #[parser] pub fn formal_port_identifier(s: Span) -> IResult { let (s, a) = identifier(s)?; Ok((s, FormalPortIdentifier { nodes: (a,) })) } #[parser] pub fn function_identifier(s: Span) -> IResult { let (s, a) = identifier(s)?; Ok((s, FunctionIdentifier { nodes: (a,) })) } #[parser] pub fn generate_block_identifier(s: Span) -> IResult { let (s, a) = identifier(s)?; Ok((s, GenerateBlockIdentifier { nodes: (a,) })) } #[parser] pub fn genvar_identifier(s: Span) -> IResult { let (s, a) = identifier(s)?; Ok((s, GenvarIdentifier { nodes: (a,) })) } #[parser] pub fn hierarchical_array_identifier(s: Span) -> IResult { let (s, a) = hierarchical_identifier(s)?; Ok((s, HierarchicalArrayIdentifier { nodes: (a,) })) } #[parser] pub fn hierarchical_block_identifier(s: Span) -> IResult { let (s, a) = hierarchical_identifier(s)?; Ok((s, HierarchicalBlockIdentifier { nodes: (a,) })) } #[parser] pub fn hierarchical_event_identifier(s: Span) -> IResult { let (s, a) = hierarchical_identifier(s)?; Ok((s, HierarchicalEventIdentifier { nodes: (a,) })) } #[parser] pub fn hierarchical_identifier(s: Span) -> IResult { let (s, a) = opt(root)(s)?; let (s, b) = many0(triple(identifier, constant_bit_select, symbol(".")))(s)?; let (s, c) = identifier(s)?; Ok((s, HierarchicalIdentifier { nodes: (a, b, c) })) } #[parser] pub fn root(s: Span) -> IResult { let (s, a) = keyword("$root")(s)?; let (s, b) = symbol(".")(s)?; Ok((s, Root { nodes: (a, b) })) } #[parser] pub fn hierarchical_net_identifier(s: Span) -> IResult { let (s, a) = hierarchical_identifier(s)?; Ok((s, HierarchicalNetIdentifier { nodes: (a,) })) } #[parser] pub fn hierarchical_parameter_identifier( s: Span, ) -> IResult { let (s, a) = hierarchical_identifier(s)?; Ok((s, HierarchicalParameterIdentifier { nodes: (a,) })) } #[parser] pub fn hierarchical_property_identifier(s: Span) -> IResult { let (s, a) = hierarchical_identifier(s)?; Ok((s, HierarchicalPropertyIdentifier { nodes: (a,) })) } #[parser] pub fn hierarchical_sequence_identifier(s: Span) -> IResult { let (s, a) = hierarchical_identifier(s)?; Ok((s, HierarchicalSequenceIdentifier { nodes: (a,) })) } #[parser] pub fn hierarchical_task_identifier(s: Span) -> IResult { let (s, a) = hierarchical_identifier(s)?; Ok((s, HierarchicalTaskIdentifier { nodes: (a,) })) } #[parser] pub fn hierarchical_tf_identifier(s: Span) -> IResult { let (s, a) = hierarchical_identifier(s)?; Ok((s, HierarchicalTfIdentifier { nodes: (a,) })) } #[parser] pub fn hierarchical_variable_identifier(s: Span) -> IResult { let (s, a) = hierarchical_identifier(s)?; Ok((s, HierarchicalVariableIdentifier { nodes: (a,) })) } #[parser] pub fn identifier(s: Span) -> IResult { alt(( map(escaped_identifier, |x| Identifier::EscapedIdentifier(x)), map(simple_identifier, |x| Identifier::SimpleIdentifier(x)), ))(s) } #[parser] pub fn index_variable_identifier(s: Span) -> IResult { let (s, a) = identifier(s)?; Ok((s, IndexVariableIdentifier { nodes: (a,) })) } #[parser] pub fn interface_identifier(s: Span) -> IResult { let (s, a) = identifier(s)?; Ok((s, InterfaceIdentifier { nodes: (a,) })) } #[parser] pub fn interface_instance_identifier(s: Span) -> IResult { let (s, a) = identifier(s)?; Ok((s, InterfaceInstanceIdentifier { nodes: (a,) })) } #[parser] pub fn inout_port_identifier(s: Span) -> IResult { let (s, a) = identifier(s)?; Ok((s, InoutPortIdentifier { nodes: (a,) })) } #[parser] pub fn input_port_identifier(s: Span) -> IResult { let (s, a) = identifier(s)?; Ok((s, InputPortIdentifier { nodes: (a,) })) } #[parser] pub fn instance_identifier(s: Span) -> IResult { let (s, a) = identifier(s)?; Ok((s, InstanceIdentifier { nodes: (a,) })) } #[parser] pub fn library_identifier(s: Span) -> IResult { let (s, a) = identifier(s)?; Ok((s, LibraryIdentifier { nodes: (a,) })) } #[parser] pub fn member_identifier(s: Span) -> IResult { let (s, a) = identifier(s)?; Ok((s, MemberIdentifier { nodes: (a,) })) } #[parser] pub fn method_identifier(s: Span) -> IResult { let (s, a) = identifier(s)?; Ok((s, MethodIdentifier { nodes: (a,) })) } #[parser] pub fn modport_identifier(s: Span) -> IResult { let (s, a) = identifier(s)?; Ok((s, ModportIdentifier { nodes: (a,) })) } #[parser] pub fn module_identifier(s: Span) -> IResult { let (s, a) = identifier(s)?; Ok((s, ModuleIdentifier { nodes: (a,) })) } #[parser] pub fn net_identifier(s: Span) -> IResult { let (s, a) = identifier(s)?; Ok((s, NetIdentifier { nodes: (a,) })) } #[parser] pub fn net_type_identifier(s: Span) -> IResult { let (s, a) = identifier(s)?; Ok((s, NetTypeIdentifier { nodes: (a,) })) } #[parser] pub fn output_port_identifier(s: Span) -> IResult { let (s, a) = identifier(s)?; Ok((s, OutputPortIdentifier { nodes: (a,) })) } #[parser] pub fn package_identifier(s: Span) -> IResult { let (s, a) = identifier(s)?; Ok((s, PackageIdentifier { nodes: (a,) })) } #[parser] pub fn package_scope(s: Span) -> IResult { alt((package_scope_package, map(unit, |x| PackageScope::Unit(x))))(s) } #[parser] pub fn package_scope_package(s: Span) -> IResult { let (s, a) = package_identifier(s)?; let (s, b) = symbol("::")(s)?; Ok(( s, PackageScope::Package(PackageScopePackage { nodes: (a, b) }), )) } #[parser] pub fn unit(s: Span) -> IResult { let (s, a) = keyword("$unit")(s)?; let (s, b) = symbol("::")(s)?; Ok((s, Unit { nodes: (a, b) })) } #[parser] pub fn parameter_identifier(s: Span) -> IResult { let (s, a) = identifier(s)?; Ok((s, ParameterIdentifier { nodes: (a,) })) } #[parser] pub fn port_identifier(s: Span) -> IResult { let (s, a) = identifier(s)?; Ok((s, PortIdentifier { nodes: (a,) })) } #[parser] pub fn production_identifier(s: Span) -> IResult { let (s, a) = identifier(s)?; Ok((s, ProductionIdentifier { nodes: (a,) })) } #[parser] pub fn program_identifier(s: Span) -> IResult { let (s, a) = identifier(s)?; Ok((s, ProgramIdentifier { nodes: (a,) })) } #[parser] pub fn property_identifier(s: Span) -> IResult { let (s, a) = identifier(s)?; Ok((s, PropertyIdentifier { nodes: (a,) })) } #[parser] pub fn ps_class_identifier(s: Span) -> IResult { let (s, a) = opt(package_scope)(s)?; let (s, b) = class_identifier(s)?; Ok((s, PsClassIdentifier { nodes: (a, b) })) } #[parser] pub fn ps_covergroup_identifier(s: Span) -> IResult { let (s, a) = opt(package_scope)(s)?; let (s, b) = covergroup_identifier(s)?; Ok((s, PsCovergroupIdentifier { nodes: (a, b) })) } #[parser] pub fn ps_checker_identifier(s: Span) -> IResult { let (s, a) = opt(package_scope)(s)?; let (s, b) = checker_identifier(s)?; Ok((s, PsCheckerIdentifier { nodes: (a, b) })) } #[parser] pub fn ps_identifier(s: Span) -> IResult { let (s, a) = opt(package_scope)(s)?; let (s, b) = identifier(s)?; Ok((s, PsIdentifier { nodes: (a, b) })) } #[parser] pub fn ps_or_hierarchical_array_identifier( s: Span, ) -> IResult { let (s, a) = opt(implicit_class_handle_or_class_scope_or_package_scope)(s)?; let (s, b) = hierarchical_array_identifier(s)?; Ok((s, PsOrHierarchicalArrayIdentifier { nodes: (a, b) })) } #[parser] pub fn ps_or_hierarchical_net_identifier(s: Span) -> IResult { alt(( ps_or_hierarchical_net_identifier_package_scope, map(hierarchical_net_identifier, |x| { PsOrHierarchicalNetIdentifier::HierarchicalNetIdentifier(x) }), ))(s) } #[parser] pub fn ps_or_hierarchical_net_identifier_package_scope( s: Span, ) -> IResult { let (s, a) = opt(package_scope)(s)?; let (s, b) = net_identifier(s)?; Ok(( s, PsOrHierarchicalNetIdentifier::PackageScope(PsOrHierarchicalNetIdentifierPackageScope { nodes: (a, b), }), )) } #[parser] pub fn ps_or_hierarchical_property_identifier( s: Span, ) -> IResult { alt(( ps_or_hierarchical_property_identifier_package_scope, map(hierarchical_property_identifier, |x| { PsOrHierarchicalPropertyIdentifier::HierarchicalPropertyIdentifier(x) }), ))(s) } #[parser] pub fn ps_or_hierarchical_property_identifier_package_scope( s: Span, ) -> IResult { let (s, a) = opt(package_scope)(s)?; let (s, b) = property_identifier(s)?; Ok(( s, PsOrHierarchicalPropertyIdentifier::PackageScope( PsOrHierarchicalPropertyIdentifierPackageScope { nodes: (a, b) }, ), )) } #[parser] pub fn ps_or_hierarchical_sequence_identifier( s: Span, ) -> IResult { alt(( ps_or_hierarchical_sequence_identifier_package_scope, map(hierarchical_sequence_identifier, |x| { PsOrHierarchicalSequenceIdentifier::HierarchicalSequenceIdentifier(x) }), ))(s) } #[parser] pub fn ps_or_hierarchical_sequence_identifier_package_scope( s: Span, ) -> IResult { let (s, a) = opt(package_scope)(s)?; let (s, b) = sequence_identifier(s)?; Ok(( s, PsOrHierarchicalSequenceIdentifier::PackageScope( PsOrHierarchicalSequenceIdentifierPackageScope { nodes: (a, b) }, ), )) } #[parser] pub fn ps_or_hierarchical_tf_identifier(s: Span) -> IResult { alt(( ps_or_hierarchical_tf_identifier_package_scope, map(hierarchical_tf_identifier, |x| { PsOrHierarchicalTfIdentifier::HierarchicalTfIdentifier(x) }), ))(s) } #[parser] pub fn ps_or_hierarchical_tf_identifier_package_scope( s: Span, ) -> IResult { let (s, a) = opt(package_scope)(s)?; let (s, b) = tf_identifier(s)?; Ok(( s, PsOrHierarchicalTfIdentifier::PackageScope(PsOrHierarchicalTfIdentifierPackageScope { nodes: (a, b), }), )) } #[parser] pub fn ps_parameter_identifier(s: Span) -> IResult { alt(( ps_parameter_identifier_scope, ps_parameter_identifier_generate, ))(s) } #[parser] pub fn ps_parameter_identifier_scope(s: Span) -> IResult { let (s, a) = opt(package_scope_or_class_scope)(s)?; let (s, b) = parameter_identifier(s)?; Ok(( s, PsParameterIdentifier::Scope(PsParameterIdentifierScope { nodes: (a, b) }), )) } #[parser] pub fn ps_parameter_identifier_generate(s: Span) -> IResult { let (s, a) = many0(triple( generate_block_identifier, opt(bracket(constant_expression)), symbol("."), ))(s)?; let (s, b) = parameter_identifier(s)?; Ok(( s, PsParameterIdentifier::Generate(PsParameterIdentifierGenerate { nodes: (a, b) }), )) } #[parser] pub fn ps_type_identifier(s: Span) -> IResult { let (s, a) = opt(local_or_package_scope_or_class_scope)(s)?; let (s, b) = type_identifier(s)?; Ok((s, PsTypeIdentifier { nodes: (a, b) })) } #[parser] pub fn sequence_identifier(s: Span) -> IResult { let (s, a) = identifier(s)?; Ok((s, SequenceIdentifier { nodes: (a,) })) } #[parser] pub fn signal_identifier(s: Span) -> IResult { let (s, a) = identifier(s)?; Ok((s, SignalIdentifier { nodes: (a,) })) } #[parser] pub fn simple_identifier(s: Span) -> IResult { let (s, a) = ws(simple_identifier_impl)(s)?; Ok((s, SimpleIdentifier { nodes: a })) } #[parser] pub fn simple_identifier_impl(s: Span) -> IResult { let (s, a) = is_a(AZ_)(s)?; let (s, b) = opt(is_a(AZ09_DOLLAR))(s)?; let a = if let Some(b) = b { concat(a, b).unwrap() } else { a }; if is_keyword(&a) { Err(Err::Error(make_error(s, ErrorKind::Fix))) } else { Ok((s, a)) } } #[parser] pub fn specparam_identifier(s: Span) -> IResult { let (s, a) = identifier(s)?; Ok((s, SpecparamIdentifier { nodes: (a,) })) } #[parser] pub fn system_tf_identifier(s: Span) -> IResult { let (s, a) = ws(system_tf_identifier_impl)(s)?; Ok((s, SystemTfIdentifier { nodes: a })) } #[parser] pub fn system_tf_identifier_impl(s: Span) -> IResult { let (s, a) = tag("$")(s)?; let (s, b) = is_a(AZ09_DOLLAR)(s)?; let a = concat(a, b).unwrap(); Ok((s, a)) } #[parser] pub fn task_identifier(s: Span) -> IResult { let (s, a) = identifier(s)?; Ok((s, TaskIdentifier { nodes: (a,) })) } #[parser] pub fn tf_identifier(s: Span) -> IResult { let (s, a) = identifier(s)?; Ok((s, TfIdentifier { nodes: (a,) })) } #[parser] pub fn terminal_identifier(s: Span) -> IResult { let (s, a) = identifier(s)?; Ok((s, TerminalIdentifier { nodes: (a,) })) } #[parser] pub fn topmodule_identifier(s: Span) -> IResult { let (s, a) = identifier(s)?; Ok((s, TopmoduleIdentifier { nodes: (a,) })) } #[parser] pub fn type_identifier(s: Span) -> IResult { let (s, a) = identifier(s)?; Ok((s, TypeIdentifier { nodes: (a,) })) } #[parser] pub fn udp_identifier(s: Span) -> IResult { let (s, a) = identifier(s)?; Ok((s, UdpIdentifier { nodes: (a,) })) } #[parser] pub fn variable_identifier(s: Span) -> IResult { let (s, a) = identifier(s)?; Ok((s, VariableIdentifier { nodes: (a,) })) } #[parser] pub fn implicit_class_handle_or_class_scope_or_package_scope( s: Span, ) -> IResult { alt(( map(pair(implicit_class_handle, symbol(".")), |x| { ImplicitClassHandleOrClassScopeOrPackageScope::ImplicitClassHandle(x) }), map(class_scope, |x| { ImplicitClassHandleOrClassScopeOrPackageScope::ClassScope(x) }), map(package_scope, |x| { ImplicitClassHandleOrClassScopeOrPackageScope::PackageScope(x) }), ))(s) } #[parser] pub fn implicit_class_handle_or_package_scope( s: Span, ) -> IResult { alt(( map(pair(implicit_class_handle, symbol(".")), |x| { ImplicitClassHandleOrPackageScope::ImplicitClassHandle(x) }), map(package_scope, |x| { ImplicitClassHandleOrPackageScope::PackageScope(x) }), ))(s) } #[parser] pub fn implicit_class_handle_or_class_scope( s: Span, ) -> IResult { alt(( map(pair(implicit_class_handle, symbol(".")), |x| { ImplicitClassHandleOrClassScope::ImplicitClassHandle(x) }), map(class_scope, |x| { ImplicitClassHandleOrClassScope::ClassScope(x) }), ))(s) } #[parser] pub fn package_scope_or_class_scope(s: Span) -> IResult { alt(( map(package_scope, |x| PackageScopeOrClassScope::PackageScope(x)), map(class_scope, |x| PackageScopeOrClassScope::ClassScope(x)), ))(s) } #[parser] pub fn local_or_package_scope_or_class_scope( s: Span, ) -> IResult { alt(( map(local, |x| LocalOrPackageScopeOrClassScope::Local(x)), map(package_scope, |x| { LocalOrPackageScopeOrClassScope::PackageScope(x) }), map(class_scope, |x| { LocalOrPackageScopeOrClassScope::ClassScope(x) }), ))(s) } #[parser] pub fn local(s: Span) -> IResult { let (s, a) = keyword("local")(s)?; let (s, b) = symbol("::")(s)?; Ok((s, Local { nodes: (a, b) })) } // ----------------------------------------------------------------------------- #[cfg(test)] mod tests { use super::*; #[test] fn test_identifier() { parser_test!( identifier, "shiftreg_a", Ok((_, Identifier::SimpleIdentifier(_))) ); parser_test!( identifier, "_bus3", Ok((_, Identifier::SimpleIdentifier(_))) ); parser_test!( identifier, "n$657", Ok((_, Identifier::SimpleIdentifier(_))) ); parser_test!( identifier, "\\busa+index", Ok((_, Identifier::EscapedIdentifier(_))) ); parser_test!( identifier, "\\-clock", Ok((_, Identifier::EscapedIdentifier(_))) ); } #[test] fn test_system_tf_identifier() { parser_test!(system_tf_identifier, "$display", Ok((_, _))); } }