Home > Perl, Programming, Tips > Program pksd.pl – Untuk Membantu Pembuatan S-Graph

Program pksd.pl – Untuk Membantu Pembuatan S-Graph

Berhubung pada postingan sebelumnya berisi tentang source code program, sekalian saja pada postingan berikutnya tentang program juga😀. Progam yang akan saya share berikutnya berhubungan dengan suatu kuliah di sekolah saya yang bernama “Perancangan dan Keterujian Sistem Digital”. Nah pada akhir kuliah ini diberikan suatu proyek akhir berupa pengujian terhadap rangkaian benchmark ISCAS’89 yang berupa rangkaian sekunsial dengan menggunakan komponen DFF.
Salah satu metode pengujian yang dilakukan adalah motode partial-scan. Sebelum melakukan pengujian dengan motede partial-scan terhadap rangkaian, diperlukan adanya informasi mengenai keterhubungan antara satu flipflop dengan flipflop yang lain. Keterhubungan yang dimaksud adalah adanya suatu jalur dalam hal ini rangkaian kombinasional antar flipflop. Pada akhirnya, informasi tersebut dibuat dalam suatu bentuk diagram yang disebut s-graph. Dalam s-graph, suatu flipflop direpresentasikan sebagai suatu vertex, dan jalur dari vertex ke vertex menggambarkan adanya jalur kombinasional dari satu flipflop ke flipflop yang lain. Nah, disinilah fungsi dari program pksd.pl ini, program ini membantu dalam melihat hubungan antar flipflop. Inti dari programnya sangat sederhana, yang melakukan looping dari suatu wire keluaran flipflop, kemudian menelusuri semua keluaran dari gate yang memiliki input wire sebelumnya, dan looping lagi sampai output wirenya terhubung dengan output atau DFF.

#-------------------------------------------------------------------------------------------------#
#!C:\Perl\bin\perl -w
# pksd.pl
# Mengeluarkan output [file.o] yang berisi ujung akhir dari DFF
# Author: Muhammad Johan A.
# v0.002, 14 Mei 2013
#-------------------------------------------------------------------------------------------------#
# Cara menjalankan: (di command line, dengan syarat file dan program di dir kerja yang sama)
# > perl -w pksd.pl [nama_file_verilog]
# misalnya:
# > perl -w pksd.pl s400.v
#-------------------------------------------------------------------------------------------------#
# Syarat input file:
# 1. DFF masih menggunakan format "dff DFF_0(CK,wire_untuk_Q,wire_untuk_D);"
# 2. setelah kata 'wire' pada module utama diberi tanda enter sehingga list wire berada di baris
#	 selanjutnya, misalnya dari yang sebelumnya:
#		wire G10,G29,G11,G30,G12,...
#	 menjadi:
#		wire
#			G10,G29,G11,G30,G12,....
# 3. input/output module utama, dan gerbang logika harus dalam satu baris, misalnya
#	 - and AND4_8(G257,G363,G369,G371, ..., IIII515); //tidak boleh ada jeda enter
#	 - input/output GND,VDD,CK, ..., G23; //tidak boleh ada jeda enter
#-------------------------------------------------------------------------------------------------#
use strict;
my (@line, @dff, %wire, %ndff, $file, $wire);
# keys pada %wire berisi nama wire/input/output, sedangkan isinya:
# 	bernilai 0 jika belum diperiksa
# 	bernilai 1 jika sudah diperiksa
$wire = 0;
$file = $ARGV[0];
open(READ, "<$file") or die "Cannot open file '$file'";
@line = <READ>, close(READ);
# Looping untuk semua baris input file
foreach my $line (@line){
	if ($line =~ /^\s*(input|output)\s/){
		while ($line =~ /([\w\d_]+)[,;]/g){ $wire{$1} = 0; }
	} elsif ($line =~ /^\s*wire\s*$/) {
		$wire = 1;
	} elsif ($wire == 1){
		while ($line =~ /\s*([\w\d_]+),*/g){ $wire{$1} = 0; }
		$wire = 0 if($line =~ /;\s*$/);
	} elsif ($line =~ /DFF_(\d+)\(CK,\s*([\w\d_]+),\s*([\w\d_]+)/){
		$dff[$1] = $2;
		$ndff{$3} = 'DFF_'.$1;
	}
}
foreach my $dff (@dff){
	my @out = ($dff);
	my %temp = %wire;
	$dff = [];
	while(defined($out[0])){
		my @temp = @out;
		@out = ();
		foreach my $wire (@temp){
			my $count = 0;
			foreach my $line (@line){
				if ($line =~ /^\s*(not|and|or|nand|nor).*\(([\d\w_]+?),.*(?<=,)\s*$wire[,)]/){
					if((!isElement($2, \@out)) and ($temp{$2} == 0)) {
						push @out, $2;
						$temp{$2} = 1;
					}
					$count++;
				}
			}
			push(@{$dff}, $wire) if ($count == 0 and isElement($wire, \@{$dff}) == 0);
		}
	}
}
# Bagian untuk menulis output file yang berisi ujung akhir suatu wire
open(TULIS, ">$file.o") or die "Cannot open file '$file'";
my $idx = 0;
foreach my $ff (@dff){
	print TULIS "DFF_$idx: ";
	foreach my $list (@{$ff}) {
		print TULIS "$list";
		if(defined($ndff{$list})){
			print TULIS "[$ndff{$list}] ";
		} else {
			print TULIS " ";
		}
	}
	print TULIS "\n"; $idx++;
}
close(TULIS);
# Fungsi untuk mengecek apakah suatu node telah diperiksa sebelumnya
sub isElement {
	my $cntr = 0;
	foreach my $elmt (@{$_[1]}){
		if($elmt eq $_[0]){ $cntr++; }
	}
	return $cntr;
}

Untuk menggunakan program ini dapat dilihat pada comment line awal program. Perlu diingat bahwa terdapat beberapa syarat pada input file, sehingga diperlukan proses edit pada input file terlebih dahulu. Source code dari program tersebut adalah sebagai berikut ini.
Contoh keluaran output filenya misal untuk rangkaian s298, keluaran outputnya adalah file s298.v.o

DFF_0: G29[DFF_0] G30[DFF_1] G34[DFF_2] G44[DFF_4] G107[DFF_10] G39[DFF_3] G102[DFF_9]
DFF_1: G30[DFF_1] G34[DFF_2] G56[DFF_5] G44[DFF_4] G86[DFF_6] G39[DFF_3] G98[DFF_8] G113[DFF_11] G92[DFF_7] G107[DFF_10] G102[DFF_9]
DFF_2: G34[DFF_2] G98[DFF_8] G30[DFF_1] G44[DFF_4] G56[DFF_5] G86[DFF_6] G39[DFF_3] G113[DFF_11] G92[DFF_7] G102[DFF_9] G107[DFF_10]
DFF_3: G30[DFF_1] G92[DFF_7] G39[DFF_3] G86[DFF_6] G102[DFF_9] G98[DFF_8] G113[DFF_11] G44[DFF_4] G56[DFF_5] G107[DFF_10]
DFF_4: G86[DFF_6] G98[DFF_8] G113[DFF_11] G44[DFF_4] G92[DFF_7] G107[DFF_10] G56[DFF_5] G102[DFF_9]
DFF_5: G56[DFF_5] G86[DFF_6] G107[DFF_10] G102[DFF_9] G92[DFF_7] G98[DFF_8] G113[DFF_11]
DFF_6: G66 G86[DFF_6]
DFF_7: G67 G92[DFF_7]
DFF_8: G117 G98[DFF_8]
DFF_9: G118 G102[DFF_9]
DFF_10: G132 G107[DFF_10]
DFF_11: G133 G113[DFF_11]
DFF_12: G119[DFF_12] G56[DFF_5] G86[DFF_6] G107[DFF_10] G102[DFF_9] G92[DFF_7] G98[DFF_8] G113[DFF_11]
DFF_13: G125[DFF_13] G44[DFF_4]

Dari keluaran output file misalnya dapat disimpulkan bahwa DFF_9 terhubung dengan wire output G118 dan G102 dalam hal ini DFF_9, atau untuk DFF_13 terhubung dengan DFF_13 dan DFF_4

Categories: Perl, Programming, Tips
  1. October 2, 2013 at 7:55 pm

    Ngeri euy source code terus isinyaa…

    • October 3, 2013 at 1:44 pm

      abis ini postingannya tentang anime deh yo

  1. No trackbacks yet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: