####################################################################### # Run Synplicity script # # rsynp -help for help ####################################################################### use warnings; use strict; use Cwd; use Cwd 'chdir'; use Getopt::Long ; $| = 1; $SIG{__DIE__} = \&sighandler ; ####################################################################### # Global variables ####################################################################### my $prg = $0; $prg =~ s/.*\/// ; $prg =~ s/,.*// ; my $all = 0; my $flat = 0; my $syn_q = "/bin/sh"; my $device = "XC4VLX200"; my $blk_list = ""; my $blk_dir; my @blocks = (); my @block_list = (); $blk_list = $ENV{DV_ROOT}; $blk_list .= "/design/sys/synplicity/block.list"; ####################################################################### # Check command line options ####################################################################### foreach my $argv (@ARGV) { if ($argv =~ /-all/) { $all = 1; } elsif (($argv =~ /-h/) or ($argv =~ /-help/)) { &usage; exit(0); } elsif ($argv =~ /-syn_q_command/) { $syn_q = $argv; $syn_q =~ s/-syn_q_command=(.*)/$1/ ; } elsif ($argv =~ /-device/) { $device = $argv; $device =~ s/-device=(.*)/$1/ ; } elsif ($argv =~ /-flat/) { $flat = 1; } else { push @blocks, $argv; } } my $count = 0; open (BLK_IN, "< $blk_list") or die ("DIE. could not open $blk_list"); if ($all) { while () { my $line = $_ ; $line =~ s/\s+$//; $count++; push @block_list, $line ; } print "$prg: Running Synplicity for all $count modules\n"; } else { my @all_blocks = ; foreach my $block (@blocks) { my (@search) = grep (/$block/, @all_blocks); foreach my $line (@search) { $line =~ s/\s+$//; push @block_list, $line ; $count++; } } if ($count) { print "$prg: Running Synplicity for $count modules\n"; } else { print "$prg: No matching modules found.\n"; &usage; } } close(BLK_IN); # check the memory list and add memory to block list if needed foreach my $block (@block_list) { $blk_dir = $ENV{DV_ROOT}; $blk_dir .= "/design/sys/iop/$block"; $blk_dir .= "/synplicity"; my $mod_name = $block; $mod_name =~ s/.*\/// ; my $mlist = $blk_dir; $mlist .= "/$mod_name"; $mlist .= ".mlist"; if ((!$flat) && ( -f $mlist )) { print "$prg: $mlist found.\n"; open (BLK_IN, "< $mlist") or die("DIE. could not open $mlist"); while () { my $line = $_ ; $line =~ s/\s+$//; $count++; my $sub_blk = $ENV{DV_ROOT}; $sub_blk .= "/design/sys/iop/$line"; $sub_blk .= "/synplicity"; my $sub_blk_mod = $sub_blk; my $line_mod = $line; $line_mod =~ s/.*\/// ; $sub_blk_mod .= "/$device/$line_mod"; $sub_blk_mod .= ".vm"; if ( -f $sub_blk_mod ) { print "$prg: Pre-compiled $line found.\n"; } else { my $cmd = "rsynp -device='$device' "; $cmd .= "$line"; print "$prg: Pre-compiled $line not found.\n"; print "$prg: Running $cmd\n"; system($cmd); } } close(BLK_IN); } } foreach my $block (@block_list) { print "$prg: Running Synplicity for $block\n"; my $cmd = $syn_q; $blk_dir = $ENV{DV_ROOT}; $blk_dir .= "/design/sys/iop/$block"; $blk_dir .= "/synplicity"; chdir $blk_dir; my $mod_name = $block; $mod_name =~ s/.*\/// ; &create_prj_file($mod_name); print "$prg: module name $mod_name\n"; $cmd .= " $ENV{DV_ROOT}/tools/bin/synp_command"; system($cmd); # if ed script exists, run it my $sed_scr = $mod_name; $sed_scr .= ".sed"; if (-f $sed_scr) { my $cmd = "/bin/ed "; $cmd .= "$device/$mod_name"; $cmd .= ".vm < $sed_scr"; print "$prg: Running script: $cmd\n"; system($cmd); } } ####################################################################### sub create_prj_file { my $mod = shift; my $flist = $mod; $flist .= ".flist"; open (FLIST_IN, "< $flist") or die ("DIE. could not open $flist"); open OUT, ">proj.prj"; print OUT "# Synplicity Project File\n\n"; print OUT "set topmodule $mod\n"; print OUT "set rev $device\n"; print OUT "set dv_root [get_env DV_ROOT]\n\n"; while () { next if(/^\/\//); next if(/^#/); chop; if (/design/) { print OUT "add_file -verilog \$dv_root/"; print OUT; print OUT "\n"; next; } if (/lib/) { print OUT "add_file -verilog \$dv_root/"; print OUT; print OUT "\n"; next; } } close FLIST_IN; if ($flat) { my $fmlist = $mod; $fmlist .= ".fmlist"; if ( -f $fmlist ) { open (FLIST_IN, "< $fmlist") or die ("DIE. could not open $fmlist"); while () { next if(/^\/\//); next if(/^#/); chop; if (/design/) { print OUT "add_file -verilog \$dv_root/"; print OUT; print OUT "\n"; next; } if (/lib/) { print OUT "add_file -verilog \$dv_root/"; print OUT; print OUT "\n"; next; } } close FLIST_IN; } } else { my $mlist = $mod; $mlist .= ".mlist"; if ( -f $mlist ) { print "$prg: $mlist found.\n"; open (BLK_IN, "< $mlist") or die("DIE. could not open $mlist"); while () { my $line = $_ ; $line =~ s/\s+$//; $count++; my $sub_blk = $ENV{DV_ROOT}; $sub_blk .= "/design/sys/iop/$line"; $sub_blk .= "/synplicity"; my $sub_blk_mod = $sub_blk; my $line_mod = $line; $line_mod =~ s/.*\/// ; $sub_blk_mod .= "/$device/$line_mod"; $sub_blk_mod .= ".vm"; if ( -f $sub_blk_mod ) { print OUT "add_file -verilog $sub_blk_mod\n"; } } close(BLK_IN); } } print OUT "\nsource \$dv_root/design/sys/synplicity/env.prj\n"; print OUT "source \$dv_root/design/sys/synplicity/$device.prj\n"; my $prj_file = $mod; $prj_file .= ".prj"; if ( -f $prj_file ) { print OUT "source $prj_file\n"; } print OUT "source \$dv_root/design/sys/synplicity/pre_syn_settings.prj\n"; close OUT; } ####################################################################### sub usage { print "\n$prg : Run Synplicity for OpenSPARC T1\n\n"; print "Options are :\n"; print " -all \n\tto run Synplicity for all blocks\n"; print " -h / -help\n\tto print help\n"; print " -syn_q_command='Your job Queue command'\n\tto specify Job queue command\n"; print " -device='Target Device'\n\tto specify Target FPGA device\n"; print " -flat \n\tTo run synthesis flat, must use this for Altera parts.\n"; print " block_list :\n\tspecify list of blocks to synthesize\n\n"; print "Examples:\n\n"; print "\t$prg -all\n\t$prg -device=XC4VLX200 sparc\n"; print "\t$prg -flat -device=EP2S180 sparc\n\n"; } #######################################################################