Remove dead node types; make report of node usage. No functional change

This commit is contained in:
Wilson Snyder 2011-10-10 18:13:42 -04:00
parent ae68a80e98
commit ca81db8edf
2 changed files with 94 additions and 36 deletions

View File

@ -1457,15 +1457,6 @@ struct AstCondBound : public AstNodeCond {
ASTNODE_NODE_FUNCS(CondBound, CONDBOUND) ASTNODE_NODE_FUNCS(CondBound, CONDBOUND)
}; };
struct AstCondD : public AstNodeCond {
// Conditional ?: statement, double rhs/lhs/out
// Parents: MATH
// Children: MATH
AstCondD(FileLine* fl, AstNode* condp, AstNode* expr1p, AstNode* expr2p)
: AstNodeCond(fl, condp, expr1p, expr2p) { numeric(AstNumeric::DOUBLE); }
ASTNODE_NODE_FUNCS(CondD, CONDD)
};
struct AstCoverDecl : public AstNodeStmt { struct AstCoverDecl : public AstNodeStmt {
// Coverage analysis point declaration // Coverage analysis point declaration
// Parents: {statement list} // Parents: {statement list}
@ -3988,25 +3979,6 @@ struct AstCReturn : public AstNodeStmt {
AstNode* lhsp() const { return op1p(); } AstNode* lhsp() const { return op1p(); }
}; };
struct AstCInclude : public AstNode {
// C++ use of another class
// Parents: MODULE
// Children: None
private:
AstNodeModule* m_modp;
public:
AstCInclude(FileLine* fl, AstNodeModule* modp)
: AstNode(fl) {
m_modp = modp;
}
ASTNODE_NODE_FUNCS(CInclude, CINCLUDE)
virtual bool broken() const { return (m_modp && !m_modp->brokeExists()); }
virtual void cloneRelink() { if (m_modp && m_modp->clonep()) {
m_modp = m_modp->clonep()->castNodeModule();
}}
AstNodeModule* modp() const { return m_modp; }
};
struct AstCMath : public AstNodeMath { struct AstCMath : public AstNodeMath {
private: private:
bool m_cleanOut; bool m_cleanOut;

View File

@ -7,28 +7,36 @@ use Getopt::Long;
use IO::File; use IO::File;
use Pod::Usage; use Pod::Usage;
use strict; use strict;
use vars qw ($Debug @Types %Classes); use vars qw ($Debug @Types %Classes %ClassRefs %Stages);
#====================================================================== #======================================================================
# main # main
$Debug = 0; $Debug = 0;
my $opt_classes; my $opt_classes;
my $opt_report;
my @Opt_Cpt; my @Opt_Cpt;
my @Opt_I; my @Opt_I;
Getopt::Long::config ("pass_through", "no_auto_abbrev"); Getopt::Long::config ("pass_through", "no_auto_abbrev");
if (! GetOptions ( if (! GetOptions (
"help" => \&usage, "help" => \&report,
"debug" => \&debug, "debug" => \&debug,
"classes!" => \$opt_classes, "classes!" => \$opt_classes,
"<>" => \&parameter, "report!" => \$opt_report,
)) { "<>" => \&parameter,
)) {
usage(); usage();
} }
read_types("$Opt_I[0]/V3Ast.h"); read_types("$Opt_I[0]/V3Ast.h");
read_types("$Opt_I[0]/V3AstNodes.h"); read_types("$Opt_I[0]/V3AstNodes.h");
read_stages("$Opt_I[0]/Verilator.cpp");
read_refs(glob("$Opt_I[0]/*.y"), glob("$Opt_I[0]/*.h"), glob("$Opt_I[0]/*.cpp"));
if ($opt_report) {
write_report(undef);
}
if ($opt_classes) { if ($opt_classes) {
write_report("V3Ast__gen_report.txt");
write_classes("V3Ast__gen_classes.h"); write_classes("V3Ast__gen_classes.h");
write_visitor("V3Ast__gen_visitor.h"); write_visitor("V3Ast__gen_visitor.h");
write_intf("V3Ast__gen_interface.h"); write_intf("V3Ast__gen_interface.h");
@ -85,6 +93,44 @@ sub read_types {
} }
} }
sub read_stages {
my $filename = shift;
my $fh = IO::File->new($filename) or die "%Error: $! $filename,";
my $n = 0;
while (defined (my $line = $fh->getline())) {
$line =~ s/\/\/.*$//;
next if $line =~ /^\s*$/;
if ($line =~ /^\s*([A-Za-z0-9]+)::/) {
my $stage = $1.".cpp";
if (!defined ($Stages{$stage})) {
$Stages{$stage} = $n++;
}
}
}
}
sub read_refs {
my @filenames = @_;
foreach my $filename (@filenames) {
(my $basename = $filename) =~ s!.*/!!;
my $fh = IO::File->new($filename) or die "%Error: $! $filename,";
while (defined (my $line = $fh->getline())) {
$line =~ s/\/\/.*$//;
while ($line =~ /\bnew\s*(Ast[A-Za-z0-9_]+)/g) {
$ClassRefs{$1}{newed}{$basename} = 1;
}
while ($line =~ /\b(Ast[A-Za-z0-9_]+)/g) {
$ClassRefs{$1}{used}{$basename} = 1;
}
}
}
#use Data::Dumper;print Dumper(\%ClassRefs);
}
#----------------------------------------------------------------------
sub open_file { sub open_file {
my $filename = shift; my $filename = shift;
my $fh = IO::File->new($filename,"w") or die "%Error: $! $filename,"; my $fh = IO::File->new($filename,"w") or die "%Error: $! $filename,";
@ -108,6 +154,42 @@ sub subclasses_of {
#---------------------------------------------------------------------- #----------------------------------------------------------------------
sub write_report {
my $filename = shift;
my $fh = defined($filename) ? open_file($filename) : \*STDOUT;
$fh->print("Processing stages (approximate, based on order in Verilator.cpp):\n");
foreach my $class (sort {$Stages{$a} <=> $Stages{$b}} keys %Stages) {
$fh->print("\t$class\n");
}
$fh->print("\nProcessing stages (approximate, based on order in Verilator.cpp):\n");
foreach my $type (sort (keys %Classes)) {
printf $fh " class %-20s\n", "Ast${type}";
$fh->print("\tparent:\t");
foreach my $subclass (subclasses_of($type)) {
next if $subclass eq 'Node';
printf $fh "Ast%-12s ",$subclass;
}
printf $fh "\n";
if (my $refs = $ClassRefs{"Ast${type}"}) {
$fh->print("\tnewed:\t");
foreach my $stage (sort {($Stages{$a}||-1) <=> ($Stages{$b}||-1)}
keys %{$refs->{newed}}) {
$fh->print($stage." ");
}
$fh->print("\n");
$fh->print("\tused:\t");
foreach my $stage (sort {($Stages{$a}||-1) <=> ($Stages{$b}||-1)}
keys %{$refs->{used}}) {
$fh->print($stage." ");
}
$fh->print("\n");
}
$fh->print("\n");
}
}
sub write_classes { sub write_classes {
my $fh = open_file(@_); my $fh = open_file(@_);
foreach my $type (sort (keys %Classes)) { foreach my $type (sort (keys %Classes)) {
@ -501,7 +583,11 @@ Displays this message and program version and exits.
=item --classes =item --classes
Makes class declaration files Makes class declaration files.
=item --report
Makes a report report.
=back =back
@ -526,5 +612,5 @@ Wilson Snyder <wsnyder@wsnyder.org>
###################################################################### ######################################################################
### Local Variables: ### Local Variables:
### compile-command: "./astgen " ### compile-command: "./astgen -I. --report"
### End: ### End: