📄 module.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 + -