#!/usr/bin/perl -w # See copyright, etc in below POD section. ###################################################################### require 5.005; use FindBin qw($RealBin); # $RealBin 保存了当前程序所在的绝对地址 use lib "$RealBin/blib/arch"; use lib "$RealBin/blib/lib"; use lib "$RealBin"; use Getopt::Long; use IO::File; # 从IO::seekable, IO::handler 派生出来 use Pod::Usage; use Verilog::Netlist; use Verilog::Getopt; use strict; use vars qw ($Debug $VERSION); $VERSION = '3.305'; ###################################################################### # main $Debug = 0; # default 为 0 my $opt_output_filename = undef; # default 为 undef my @opt_files; autoflush STDOUT 1; # IO::handler 中的函数,自动flush buffer,不必等到运行完毕才打印消息 autoflush STDERR 1; # Option parsing # 初始化各个Option变量, coding style值得学习, 前缀用Opt_ my $Opt = new Verilog::Getopt(); my $Opt_Cells; my $Opt_Modules; my $Opt_ModFiles; my $Opt_InFiles; my $Opt_Missing = 1; # default 值,缺省文件丢失报错 my $Opt_Missing_Modules; my $Opt_TopModule; my $Opt_Xml; my $Opt_ResolveFiles; @ARGV = $Opt->parameter(@ARGV); # 先分析@ARGV 中verilog的常用选项(如-v,-y,+libext,+incdir,+define+等)调用相应的子程序,并从@ARGV中remove,剩下不能识别的选项。 Getopt::Long::config ("no_auto_abbrev"); # 不允许自动缩写 if (! GetOptions ( # 分析剩下的选项 "help" => /&usage, # 直接调用usage子程序 "debug" => /&debug, # 直接调用debug子程序 "o=s" => /$opt_output_filename, "cells!" => /$Opt_Cells, "module-files!" => /$Opt_ModFiles, "modules!" => /$Opt_Modules, "input-files!" => /$Opt_InFiles, "resolve-files!" => /$Opt_ResolveFiles, "sv!" => sub { shift; Verilog::Language::language_standard("1800-2009"); }, #直接调用匿名子程序, 第一个shift是移出-sv, 实际上是shift @_; @_的内容就是选项和选项值 "language=s" => sub { shift; Verilog::Language::language_standard(shift); }, #匿名子程序中用shift,非常有效,第一个是--language 第二个是选项值,譬如 systemverilog "missing!" => /$Opt_Missing, "missing-modules!" => /$Opt_Missing_Modules, "top-module=s" => /$Opt_TopModule, "version" => sub { print "Version $VERSION/n"; exit(0); }, "xml!" => /$Opt_Xml, "<>" => /¶meter, # 用来处理非option的其他参数 )) { die "%Error: Bad usage, try 'vhier --help'/n"; } #一种很好的格式,如果GetOptions 失败,那么退出打印信息。当然也可直接调用usage if (!@opt_files) { # 为空则退出 die "%Error: vhie