⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 module.pm

📁 Verilog Parser in Perl
💻 PM
字号:
# Verilog - Verilog Perl Interface# See copyright, etc in below POD section.######################################################################package Verilog::Netlist::Module;use Class::Struct;use Verilog::Netlist;use Verilog::Netlist::Port;use Verilog::Netlist::Net;use Verilog::Netlist::Cell;use Verilog::Netlist::Pin;use Verilog::Netlist::Subclass;use vars qw($VERSION @ISA);use strict;@ISA = qw(Verilog::Netlist::Module::Struct	Verilog::Netlist::Subclass);$VERSION = '3.120';structs('new',	'Verilog::Netlist::Module::Struct'	=>[name     	=> '$', #'	# Name of the module	   filename 	=> '$', #'	# Filename this came from	   lineno	=> '$', #'	# Linenumber this came from	   netlist	=> '$', #'	# Netlist is a member of	   userdata	=> '%',		# User information	   attributes	=> '%', #'	# Misc attributes for systemperl or other processors	   #	   attrs	=> '@',		# list of "category name[ =](.*)" strings	   comment	=> '$', #'	# Comment provided by user	   _ports	=> '%',		# hash of Verilog::Netlist::Ports	   _portsordered=> '@',		# list of Verilog::Netlist::Ports as ordered in list of ports	   _nets	=> '%',		# hash of Verilog::Netlist::Nets	   _cells	=> '%',		# hash of Verilog::Netlist::Cells	   _celldecls	=> '%',		# hash of declared cells (for autocell only)	   _cellarray	=> '%',		# hash of declared cell widths (for autocell only)	   _level	=> '$',		# Depth in hierarchy (if calculated)	   is_top	=> '$', #'	# Module is at top of hier (not a child)	   is_libcell	=> '$', #'	# Module is a library cell	   # SystemPerl:	   _autocovers  => '%', #'	# Hash of covers found in code	   _autosignal	=> '$', #'	# Module has /*AUTOSIGNAL*/ in it	   _autosubcells=> '$', #'	# Module has /*AUTOSUBCELL_DECL*/ in it	   _autotrace	=> '%', #'	# Module has /*AUTOTRACE*/ in it	   _autoinoutmod=> '$', #'	# Module has /*AUTOINOUT_MODULE*/ in it	   _pintemplates=> '@', #'	# Module SP_TEMPLATEs	   _ctor	=> '$', #'	# Module has SC_CTOR in it	   _code_symbols=> '$', #'	# Hash ref of symbols found in raw code	   _covergroups => '%', #'	# Hash of covergroups found in code	   lesswarn     => '$',	#'	# True if some warnings should be disabled	   ]);sub delete {    my $self = shift;    foreach my $oref ($self->nets) {	$oref->delete;    }    foreach my $oref ($self->ports) {	$oref->delete;    }    foreach my $oref ($self->cells) {	$oref->delete;    }    my $h = $self->netlist->{_modules};    delete $h->{$self->name};    return undef;}######################################################################sub logger {    return $_[0]->netlist->logger;}sub modulename_from_filename {    my $filename = shift;    (my $module = $filename) =~ s/.*\///;    $module =~ s/\.[a-z]+$//;    return $module;}sub find_port {    my $self = shift;    my $search = shift;    return $self->_ports->{$search} || $self->_ports->{"\\".$search." "};}sub find_port_by_index {    my $self = shift;    my $myindex = shift;    # @{$self->_portsordered}[$myindex-1] returns the name of    # the port in the module at this index.  Then, this is    # used to find the port reference via the port hash    return $self->_ports->{@{$self->_portsordered}[$myindex-1]};}sub find_cell {    my $self = shift;    my $search = shift;    return $self->_cells->{$search} || $self->_cells->{"\\".$search." "};}sub find_net {    my $self = shift;    my $search = shift;    my $rtn = $self->_nets->{$search}||"";    #print "FINDNET ",$self->name, " SS $search  $rtn\n";    return $self->_nets->{$search} || $self->_nets->{"\\".$search." "};}sub attrs_sorted {    return (sort {$a cmp $b} @{$_[0]->attrs});}sub nets {    return (values %{$_[0]->_nets});}sub nets_sorted {    return (sort {$a->name() cmp $b->name()} (values %{$_[0]->_nets}));}sub ports {    return (values %{$_[0]->_ports});}sub ports_sorted {    return (sort {$a->name() cmp $b->name()} (values %{$_[0]->_ports}));}sub ports_ordered {    return ( @{$_[0]->_portsordered});}sub cells {    return (values %{$_[0]->_cells});}sub cells_sorted {    return (sort {$a->name() cmp $b->name()} (values %{$_[0]->_cells}));}sub nets_and_ports_sorted {    my $self = shift;    my @list = ($self->nets, $self->ports,);    my @outlist; my $last = "";    # Eliminate duplicates    foreach my $e (sort {$a->name() cmp $b->name()} (@list)) {	next if $e eq $last;	push @outlist, $e;	$last = $e;    }    return (@outlist);}sub new_net {    my $self = shift;    # @_ params    # Create a new net under this module    my $netref = new Verilog::Netlist::Net (direction=>'net', type=>'wire',					    @_,					    module=>$self, );    $self->_nets ($netref->name(), $netref);    return $netref;}sub new_attr {    my $self = shift;    my $clean_text = shift;    push @{$self->attrs}, $clean_text;}sub new_port {    my $self = shift;    # @_ params    # Create a new port under this module    my $portref = new Verilog::Netlist::Port (@_, module=>$self,);    $self->_ports ($portref->name(), $portref);    return $portref;}sub new_cell {    my $self = shift;    # @_ params    # Create a new cell under this module    my $cellref = new Verilog::Netlist::Cell (@_, module=>$self,);    $self->_cells ($cellref->name(), $cellref);    return $cellref;}sub level {    my $self = shift;    my $level = $self->_level;    return $level if defined $level;    $self->_level(1);  # Set before recurse in case there's circular module refs    foreach my $cell ($self->cells) {	if ($cell->submod) {	    my $celllevel = $cell->submod->level;	    $self->_level($celllevel+1) if $celllevel >= $self->_level;	}    }    return $self->_level;}sub link {    my $self = shift;    # Ports create nets, so link ports before nets    foreach my $portref ($self->ports) {	$portref->_link();    }    foreach my $netref ($self->nets) {	$netref->_link();    }    foreach my $cellref ($self->cells) {	$cellref->_link();    }}sub lint {    my $self = shift;    if (!$self->netlist->{skip_pin_interconnect}) {	foreach my $portref ($self->ports) {	    $portref->lint();	}	foreach my $netref ($self->nets) {	    $netref->lint();	}    }    foreach my $cellref ($self->cells) {	$cellref->lint();    }}sub verilog_text {    my $self = shift;    my @out = "module ".$self->name." (\n";    my $indent = "   ";    # Port list    my $comma="";    push @out, $indent;    foreach my $portref ($self->ports_sorted) {	push @out, $comma, $portref->verilog_text;	$comma = ", ";    }    push @out, ");\n";    # Signal list    foreach my $netref ($self->nets_sorted) {	push @out, $indent, $netref->verilog_text, "\n";    }    # Cell list    foreach my $cellref ($self->cells_sorted) {	push @out, $indent, $cellref->verilog_text, "\n";    }    push @out, "endmodule\n";    return (wantarray ? @out : join('',@out));}sub dump {    my $self = shift;    my $indent = shift||0;    my $norecurse = shift;    print " "x$indent,"Module:",$self->name(),"  File:",$self->filename(),"\n";    if (!$norecurse) {	foreach my $portref ($self->ports_sorted) {	    $portref->dump($indent+2);	}	foreach my $netref ($self->nets_sorted) {	    $netref->dump($indent+2);	}	foreach my $cellref ($self->cells_sorted) {	    $cellref->dump($indent+2);	}    }}########################################################################## Package return1;__END__=pod=head1 NAMEVerilog::Netlist::Module - Module within a Verilog Netlist=head1 SYNOPSIS  use Verilog::Netlist;  ...  my $module = $netlist->find_module('modname');  my $cell = $self->find_cell('name')  my $port =  $self->find_port('name')  my $net =  $self->find_net('name')=head1 DESCRIPTIONA Verilog::Netlist::Module object is created by Verilog::Netlist for everymodule in the design.=head1 ACCESSORSSee also Verilog::Netlist::Subclass for additional accessors and methods.=over 4=item $self->cellsReturns list of references to Verilog::Netlist::Cell in the module.=item $self->cells_sortedReturns list of name sorted references to Verilog::Netlist::Cell in the module.=item $self->commentReturns any comments following the definition.  keep_comments=>1 must bepassed to Verilog::Netlist::new for comments to be retained.=item $self->find_port_by_indexReturns the port name associated with the given index.=item $self->is_topReturns true if the module has no cells referencing it (is at the top of the hierarchy.)=item $self->nameThe name of the module.=item $self->netlistReference to the Verilog::Netlist the module is under.=item $self->netsReturns list of references to Verilog::Netlist::Net in the module.=item $self->nets_sortedReturns list of name sorted references to Verilog::Netlist::Net in the module.=item $self->nets_and_ports_sortedReturns list of name sorted references to Verilog::Netlist::Net andVerilog::Netlist::Port in the module.=item $self->portsReturns list of references to Verilog::Netlist::Port in the module.=item $self->ports_orderedReturns list of textual port names in the order the ports were declared inthe module's port list.  For references to the ports in the same order, usefind_port_by_index.=item $self->ports_sortedReturns list of name sorted references to Verilog::Netlist::Port in the module.=back=head1 MEMBER FUNCTIONSSee also Verilog::Netlist::Subclass for additional accessors and methods.=over 4=item $self->autosUpdates the AUTOs for the module.=item $self->find_cell(I<name>)Returns Verilog::Netlist::Cell matching given name.=item $self->find_port(I<name>)Returns Verilog::Netlist::Port matching given name.=item $self->find_net(I<name>)Returns Verilog::Netlist::Net matching given name.=item $self->levelReturns the reverse depth of this module with respect to other modules.Leaf modules (modules with no cells) will be level 1.  Modules whichinstantiate cells of level 1 will be level 2 modules and so forth.  Seealso Netlist's modules_sorted_level.=item $self->lintChecks the module for errors.=item $self->linkCreates interconnections between this module and other modules.=item $self->modulename_from_filenameUses a rough algorithm (drop the extension) to convert a filename to themodule that is expected to be inside it.=item $self->new_cellCreates a new Verilog::Netlist::Cell.=item $self->new_portCreates a new Verilog::Netlist::Port.=item $self->new_netCreates a new Verilog::Netlist::Net.=item $self->dumpPrints debugging information for this module.=item $self->verilog_textReturns verilog code which represents this module.  Returned as an arraythat must be joined together to form the final text string.=back=head1 DISTRIBUTIONVerilog-Perl is part of the L<http://www.veripool.org/> free Verilog EDAsoftware tool suite.  The latest version is available from CPAN and fromL<http://www.veripool.org/verilog-perl>.Copyright 2000-2009 by Wilson Snyder.  This package is free software; youcan redistribute it and/or modify it under the terms of either the GNULesser General Public License or the Perl Artistic License.=head1 AUTHORSWilson Snyder <wsnyder@wsnyder.org>=head1 SEE ALSOL<Verilog-Perl>,L<Verilog::Netlist::Subclass>L<Verilog::Netlist>=cut

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -