Tuesday, May 10, 2011

14th IEEJ International Analog VLSI Conference in Indonesia 2011


First Call For Paper

2011 IEEJ International Analog VLSI Workshop
November 2 - 4, 2011 Bali, Indonesia

INTRODUCTION
The Research Committee on Electronic Circuits of the Institute of Electrical Engineers of Japan (IEEJ) is sponsoring and cooperating with Bandung Institute of Technology and IEEE Indonesia Section to hold the 2011 International Analog VLSI Workshop in Bali, Indonesia, on November 2-4, 2011. The purpose of the workshop is to exchange information, ideas and recent research results on analog VLSI circuits and their applications. This workshop has formed a long-standing community for various analog VLSI circuit specialists from both industry and academia worldwide, and promoted active brainstorming among them at the site.

TOPICS:

   * Analog and Mixed Analog-Digital Integrated Circuits (Amplifiers,
      Filters, Comparators, Oscillators, Multipliers, Voltage/Current
      References, Sample-And-Hold Circuits, A/D and D/A Converters, PLL,
      High speed IO Interface, DC-DC converters)

   * Analog Signal and Information Processing  Applications
      (Telecommunication, Multimedia, Automotive Electronics, Biomedical
      Electronics, Consumer Electronics, Neural Networks, Sensing and
      Sensor Networks, Space and Military Electronics)

   * Analog VLSI Design Automation (Layout Techniques, Simulation
      Techniques, AHDL, Analog IP)   

   * Digital Circuits and Digital Signal Processing   

   * Biomedical Circuits and System   

   * Power Electronics   

   * VLSI Architecture

SUBMISSION
Authors are required to send their manuscripts written in English within 4-6 pages, along with information which includes the complete title, author name(s), affiliation(s) of author(s), and corresponding author (name, postal and e-mail addresses, telephone/fax numbers), via online submission at our website (to be announced) by June 10, 2011. After peer reviewing by experts, notification of acceptance will be sent via e-mail by August, 2011.

Camera ready manuscript should be prepared in the workshop format which is provided on the website. The deadline for camera-ready manuscript submission is August 19, 2011. At least one of the authors must register by September 2, 2011. Otherwise the paper will not be included in the workshop proceedings. It is mandatory that all accepted papers must be presented at the workshop.

IMPORTANT DATES
Deadline for Paper Submission : June 10, 2011
Notification of Acceptance : August 1, 2011
Deadline of Camera Ready Manuscript Submission : August 19, 2011
Deadline for Author Registration : September 2, 2011
Deadline for Early Registration (Non-Authors) : September 30, 2011

CONTACT PERSON
General Secretary: EVA MUCHTAR (Bandung Institute of Technology)
secretary@avw2011.stei.itb.ac.id

TPC Secretary: MICHITAKA YOSHINO (Hosei University)
michitaka.yoshino.43@adm.hosei.ac.jp 

*) Please contact TPC Secretary for technical matter, and ask other else to General Secretary.

Tuesday, May 3, 2011

Debugging di Eclipse: Memeriksa Element Pointer Array

Sebagai IDE, Eclipse bisa digunakan sebagai editor, builder/compiler, sekaligus debugger. Debugger di Eclipse berbasiskan GDB (GNU Debugger). Pada awalnya, GDB dibuat oleh Richard Stallman, penggagas open source software. Debugging menggunakan GDB saja tidak cukup, terutama karena set breakpoint pada GDB kurang intuitif, dan GDB tidak bisa menampilkan perjalanan step proses pada source code, ini juga berhubungan erat dengan intuisi debugging. Oleh karena itu, diperlukan front-end tools yang berbasis GDB untuk debugging, salah satunya Eclipse.

Sebagaimana layaknya tools GUI debugger, Eclipse menyediakan window khusus untuk menampilkan variable-variable dan nilainya. Bahkan jika nilai dalam variable berubah, Eclipse langsung memberikan tanda kuning pada variable tersebut, agar lebih eye catching. Tapi tetap saja debugging di Eclipse tidak se-"handy" Matlab, terutama karena ada tipe variabel yang nilainya tidak bisa langsung dilihat dengan mudah, yaitu pada kasus pointer. 


Jika pointer dimanfaatkan sebagai array, nilai masing-masing element dalam array tidak bisa terlihat dalam variable browser Eclipse. Berbeda jika array dibuat menggunakan static array. 

Untuk bisa memeriksa nilai element dalam pointer array, buka console GDB. Lalu ketikkan perintah GDB berikut.

print *([nama_pointer]+[index_awal])@[jumlah_element_yg_diperiksa]

Misalnya:


int *array;
array = malloc(5 * sizeof(int));
array[0] = 1;
array[1] = 2;
array[2] = 3;
array[3] = 4;
array[4] = 5;

Maka, untuk melihat nilai element array data, sejumlah 5 element, ketikkan perintah berikut di console GDB Eclipse:


print *(array)@5

Bisa juga disingkat menjadi:

p *(array)@5

Berikut contoh beberapa command untuk memeriksa nilai element array (real case).

1. Memeriksa nilai array mulai index pertama sampai sejumlah 5 element array.

p *code_deconcat1_row.data@5

2. Memeriksa nilai array mulai index kedua.

p *(code_deconcat1_row.data+2)

3. Memeriksa nilai array mulai index kedua sampai sejumlah 4 element array.

p *(code_deconcat1_row.data+2)@4

Selamat mencoba =)



Wednesday, April 13, 2011

Karakteristik Kualitas Code (Software Engineering, dll.)


Software Quality Assurance 

Quality assurance (QA) merupakan hal yang biasa dan ada di segala bidang industri; mulai dari industri besar seperti industri pesawat terbang, sampai industri kecil seperti industri pakaian. Tak kalah dengannya,  software engineering, bahkan quality assurance menjadi hal pokok dan penting dalam software engineering. Buku "Code Complete: A Handbook of Software Construction" membahas mendetail mengenai bagaimana membuat software yang berkualitas, bukan bagaimana membuat software dengan bahasa ini, teknik itu, dan sebagainya. Quality bisa dipandang dalam dua sisi: eksternal dan internal. Berikut beberapa cuplikan yang diambil dari buku tersebut, mengenai karakteristik kualitas software baik dari sisi eksternal maupun internal.

Karakteristik Kualitas Eksternal

Correctness. The degree to which a system is free from faults in its specification, design, and implementation.

Usability. The ease with which users can learn and use a system.

Efficiency. Minimal use of system resources, including memory and execution time.

Reliability. The ability of a system to perform its required functions under stated conditions whenever required—having a long mean time between failures.

Integrity. The degree to which a system prevents unauthorized or improper access to its programs and its data. The idea of integrity includes restricting unauthorized user accesses as well as ensuring that data is accessed properly—that is, that tables with parallel data are modified in parallel, that date fields contain only valid dates, and so on.

Adaptability. The extent to which a system can be used, without modification, in applications or environments other than those for which it was specifically designed.

Accuracy. The degree to which a system, as built, is free from error, especially with respect to quantitative outputs. Accuracy differs from correctness; it is a determination of how well a system does the job it’s built for rather than whether it was built correctly.

Robustness. The degree to which a system continues to function in the presence of invalid inputs or stressful environmental conditions. 

Karakteristik Kualitas Internal

Maintainability. The ease with which you can modify a software system to change or add capabilities, improve performance, or correct defects.

Flexibility. The extent to which you can modify a system for uses or environments other than those for which it was specifically designed.

Portability. The ease with which you can modify a system to operate in an environment different from that for which it was specifically designed.

Reusability. The extent to which and the ease with which you can use parts of a system in other systems.

Readability. The ease with which you can read and understand the source code of a system, especially at the detailed-statement level.

Testability. The degree to which you can unit-test and system-test a system; the degree to which you can verify that the system meets its requirements.

Understandability. The ease with which you can comprehend a system at both the system-organizational and detailed-statement levels. Understandability has to do with the coherence of the system at a more general level than readability does.

Dari beberapa karakteristik tersebut, terdapat beberapa point yang mirip-mirip tetapi berbeda makna dan tujuannya. Pada beberapa kasus, point yang satu lebih tepat dari point selainnya, begitu juga sebaliknya. Bahkan mungkin ada beberapa karakteristik internal yang sepertinya overlap dengan karakteristik eksternal, namun berbeda aplikasinya.

Secara umum, pengguna (user) hanya peduli dengan karakteristik eksternal saja, apakah code tersebut mudah digunakan, apakah mudah dimodifkasi, dan sebagainya. Mereka tidak peduli apakah struktur code sudah baik, atau mudah dibaca. Sebaliknya, bagi programmer, yang penting adalah bagaimana proses development mereka berjalan mulus, yaitu dengan membuat code yang berkualitas dari sisi struktur yang baik, kemudahan dibaca, kemudahan didebug, dan sebagainya. 

Quality assurance memandang keduanya penting, namun pada aplikasinya, tentu harus dilihat dulu mana yang lebih prioritas, karena project yang satu dengan yang lain berbeda kebutuhannya. Namum daftar karakteristik diatas bisa jadi rujukan dan entry point, bagaimana membuat rencana dan arahan quality yang akan dibangung pada project tersebut. Oh iya, satu lagi, karakteristik kualitas ini juga bisa diapllikasikan dalam development model dan hardware, karena pada prinspinya, keduanya juga menggunakan bahasa pemrograman (code). (Ya2n)

Thursday, April 7, 2011

Plugin Eclipse IDE untuk Desain dan Verifikasi (DVT)



Salah satu IDE (Integrated Development Environment) favorit saya adalah Eclipse, karena support untuk banyak bahasa, banyak plugin yang bisa diinstall dan developmentnya masih berjalan terus. Fitur yang dimiliki Eclipse diantaranya: syntax highlighting, code completing, automatic indention, dan tentunya debugging environment. Bahasa pemrograman yang disupport mulai dari  mulai dari Java, C/C++, SystemC, Python, sampai bahasa spesifik untuk Desain dan Verifikasi Chip seperti Verilog, VHDL, SystemVerilog, bahkan OVMUVM, dan Cadence e. Untuk memulai memakai Eclipse, install dulu Eclipse-basic package-nya, bisa pakai Eclipse biasa (Java) atau Eclipse CDT (C/C++). Saya memakai Eclipse CDT karena untuk development, saya membutuhkan C/C++, bukan Java.

Tak hanya bahasa pemrograman yang disupport, kelengkapan tools development lainnya seperti SCM (Source Code Management), CVS, SVN, Git, dan segudang tools lainnya (mereka mengklaim ada lebih dari 1000-an tools) yang bisa ditambahkan di Eclipse. Semua ini bisa didapatkan dengan menginstall plugin Eclipse dari website mereka, mereka menyebutnya Eclipse Marketplace. Secara umum, untuk instalasi Plugin Eclipse, tinggal buka Eclipse, klik Help > Install New Software, lalu bubuhkan alamat repository plugin yang ingin diinstall.

Untuk menginstall plugin DVT (Design and Verification) di Eclipse, berikut langkah-langkahnya:
1. Buka Eclipse
2. Klik Help > Install New Software
3. Pada form Work With, tulis: http://dvteclipse.com/update
4. Klik Add
5. Pada form Name, tulis: DVT
6. Klik OK, lalu akan muncul pilihan plugin yaitu: Design and Verification Tools dan Help Plugin.
7. Check-box semua pilihan lalu klik Next, lalu akan mucul summary dari plugin yang akan diinstal (seperti pada gambar diatas).
8. Klik Next, untuk membaca License Agreement, dan pilihkan I accept the term and license agreement
9. Klik Finish dan tunggu proses intalasi selesai. 
10. Restart Eclipse untuk mulai memakai tools DVT. 

Referensi selengkapnya bisa dilihat di Eclipse Marketplace atau DVT Eclipse.
Selamat mencoba! =) (ya2n)

Thursday, March 31, 2011

Mengenal GPU dan CUDA

Beberapa dekade terakhir nama GPU (Graphic Processing Unit) mencuat. GPU pada awalnya dipakai sebagai accelerator untuk pemrosesan grafis pada komputer yang biasanya paling banyak dimanfaatkan oleh aplikasi game. Namun pada perkembangannya, GPU mulai dilirik sebagai accelerator untuk pemrosesan algoritma yang lebih umum, seperti komputasi numerik, realtime medical imaging, komputasi bioinfiormatika, embedded system, dan lainnya. GPU jenis ini dikenal dengan nama GPGPU (General Purpose GPU). Dalam proses desain chip, terutama yang membutuhkan permodelan realtime seperti wireless system, GPU menjadi solusi menarik untuk mengimplementasikan model dalam realtime dan memverifikasinya.

NVIDIA, sebagai sala satu pengembang GPU, melihat potensi ini kemudian mengembangkan seri-seri GPGPU dengan engine yang bisa diakses secara bebas yaitu CUDA. CUDA (Compute Unified Device Architacture) adalah engine untuk mengakses GPU NVIDIA dan API-nya bisa dipanggil oleh program C secara natural. Klaim dari pihak NVIDIA menyatakan bahwa GPU-card NVIDIA Tesla yang mereka miliki bisa memproses operasi foating-point single precision sampai 1TeraFLOPS.


Apa perbedaan CPU dengan GPU? CPU dan GPU saat ini sama-sama memiliki core processor lebih dari satu (multicore). CPU biasanya maksimal saat ini 4-core processor, atau disebut quad-core, sedangkan GPU bisa mencapai sampai 400-core. Walaupun sama-sama multicore, ada perbedaan mendasar pada paradigma multicore-nya. Kalau CPU adalah MIMD, Multiple-Instruction Multiple-Data, sedangkan GPU adalah SIMD, Single-Instruction Multiple-Data.

Instalasi (Driver, CUDA Toolkit, dan SDK)

Berikut langkah-langkah dalam instalasi GPU NVIDIA. Ada tiga macam yang perlu diinstal: NVIDIA Driver, CUDA toolkit, dan SDK (Software Development Kit). Driver, CUDA tookit, dan SDK bisa didownload di website NVIDIA.

Berikut file-file yang saya download untuk Ubuntu 10.0:

NVIDIA-Linux-x86_64-260.19.44.run
cudatoolkit_3.2.16_linux_64_ubuntu10.04.run
gpucomputingsdk_3.2.16_linux.run

Untuk menginstall NVIDIA Driver, matikan dulu X-servernya, jalankan installernya, lalu aktifkan kembali X-servernya atau bisa juga reboot.

(ALT+F1)
$ sudo su
$ /etc/init.d/gdm stop
$ cd <NVIDIA_Driver_Path>
$ ./NVIDIA-Linux-x86_64-260.19.44.run

$ /etc/init.d/gdm start

Untuk menginstall CUDA toolkit, jalankan instaler sebagai root.

$ sudo su
$ ./cudatoolkit_3.2.16_linux_64_ubuntu10.04.run

Disini akan ditanya dimana CUDA akan diinstal, defaultnya diinstall di /usr/local/cuda, tapi bisa juga diset untuk diinstall ditempat lain misalnya /opt/cuda. Setelah installasi selesai, set variable PAT dan LD_LIBRARY_PATH mengarah ke tempat instalasi CUDA. Edit file ~/.bashrc dan tambahkan line berikut (asumsi CUDA diinstall di /usr/local/cuda), lalu eksekusi ~/.bashrc tersebut.

export PATH=$PATH:/usr/local/cuda/bin
export LD_LIBRARY_PATH=/usr/local/cuda/lib

$ source ~/.bashrc

Jika instalasi berhasil, compiler bawaan CUDA (nvcc) sudah bisa dijalankan. Buat  hello world biasa dalam bahasa C,dan coba compile dan jalankan hello worldnya.

$ nvcc –o hello hello.c
$ ./hello
Hello

Compiler CUDA (nvcc) bekerja sama persis dengan gcc, apabila extension filenya adalah .c. Agar code dianggap sebagai CUDA code, ubah extensionya menjadi .cu. Penjelasan lebih lanjut mengenai ini bisa disimak pada bagian “Hello World” dalam artikel ini.

Untuk instalasi SDK, jalankan installer sebagai root.

$ sudo su
$ ./gpucomputingsdk_3.2.16_linux.run

Ketika installasi, lokasi instalasi CUDA toolkit akan diminta. Pada proses intalasi (terutama Ubuntu), akan ditemui beberapa masalah, terutama masalah library. Biasanya ada dua library yang perlu ditambahkan, yaitu library X Windows dan OpenGL (lXi, dan lglut).

$ sudo apt-get install libXi-dev libglut3 libglut3-dev

OK, SDK sudah terinstall dan siap digunakan. Untuk mencobanya, masuk ke directory /C/src, copy project template, compile dan jalankan binary-nya, kalau berhasil, kalimat “Test PASSED” akan muncul.

$ cd /C/src
$ cp –r template coba
$ cd coba
$ make
$ ../../bin/linux/release/template
Test PASSED

Pada beberapa kasus, muncul error linker. Kasus yang sering muncul adalah:
 
/usr/bin/ld: cannot find -lshrutil_x86_64
/usr/bin/ld: cannot find -lcutil_x86_64
/usr/bin/ld: cannot find -lglut
/usr/bin/ld: cannot find -lGL

Berikut solusi-solusinya:

ERROR: /usr/bin/ld: cannot find -lshrutil_x86_64
Cek dulu, seharusnya library -lshrutil_x86_64 ada di /shared/lib, kalau belum ada bisa di-create ulang:

$ cd /shared
$ make


ERROR: /usr/bin/ld: cannot find -lcutil_x86_64
Cek dulu, seharusnya library -lcutil_x86_64 ada di /C/lib, kalau belum ada bisa di-create ulang:

$ cd /C
$ make

ERROR: /usr/bin/ld: cannot find -lglut
ERROR: /usr/bin/ld: cannot find -lGL
Berarti library OpenGL belum tersedia, untuk Ubuntu jalankan command berikut:

$ sudo apt-get install libglut3 libglut3-dev

Lalu tapi ada sedikit tweak untuk Ubuntu, yaitu kalau masih ada error /usr/bin/ld: cannot find -lGL, artinya library /usr/lib/libGL.so broken (lihat http://ubuntuforums.org/showthread.php?t=1480282). Solusinya, delete file /usr/lib/libGL.so, lalu buat link dari /usr/lib/libGL.so.1
 
$ rm /usr/lib/libGL.so
$ ln -s /usr/lib/libGL.so.1 /usr/lib/libGL.so

Sampai disini installasi sudah selesai semua, Driver, CUDA toolkit, dan SDK. Kita bisa coba lagi menjalankan program template.

$ cd /C/src
$ cp –r template coba
$ cd coba
$ make
$ ../../bin/linux/release/template
Test PASSED

CUDA Hello World (First Program)

#include
#include

int main(int argc, char *argv[])
{
    printf("Hello\n");
    return 0;
}

Program hello world dalam C sudah dicoba pada bagian instalasi, dan bisa berjalan dengan baik, karena ketika program hello world tersebut dijalankan, eksekusi hanya dilakukan pada CPU. Kita akan sedikit memodifikasi code hello world sebelumnya, dengan menambahkan dua hal:
  • Fungsi kosong bernama kernel() dengan quaifier __global__
  • Call ke fungsi kosong kernel(), dengan imbuhan <<<1, 1>>>


#include
#include
#include "cuda.h"

__global__ void kernel(void) {
}

int main(int argc, char *argv[])
{
    kernel<<<1,1>>>();
    printf("Hello\n");
    return 0;
}

CUDA menambahkan qualifier __global__ pada standard C. Qualifier ini akan memberitahu compiler bahwa eksekusi fungsi didalam __global__ dilakukan di device (GPU), bukan di host (CPU). Call ke fungsi kernel menggunakan imbuhan <<<1, 1>>> untuk memberitahu, bagaimana fungsi kernel dijalankan di device (GPU). Compile code diatas, dan jalankan programnya, maka akan keluar hasil yang sama, yaitu “Hello”, sama persis dengan sebelum dimodifikasi, karena memang fungsi di GPU kosong. Sekarang kita coba tambahkan fungsi sederhana yang dijalankan di GPU, yaitu fungsi penjumlahan.

#include
#include
#include "cuda.h"

__global__ void add( int a, int b, int *c ) {
    *c = a + b;
}

int main(int argc, char *argv[])
{
    int c;
    int *dev_c;
 
    cudaMalloc( (void**)&dev_c, sizeof(int) );   
    add<<<1,1>>>( 2, 7, dev_c ); 
    cudaMemcpy( &c,  dev_c,  sizeof(int),  cudaMemcpyDeviceToHost );
    printf( "2 + 7 = %d\n", c );
    cudaFree( dev_c );
}

Compile code-nya, lalu jalankan programnya.

$ nvcc -o hello hello.cu
$ ./hello
2 + 7 = 9


Voila! selamat mencoba! (Ya2n)

Tuesday, March 15, 2011

Design hierarki sistem menggunakan TLM-2.0

TLM (Transaction Level Modeling) adalah tools yang disediakan SystemC untuk memodelkan komunikasi antar modul dalam system, baikan dalam hardware, software, ataupun komunikasi yang melibatkan hardware software. TLM memungkinkan kita modelkan sistem dilakukan dengan cepat. Salah satu hal penting yang kita butuhkan dalam memodelkan sistem adalah kemampuan merepresentasikan hierarchy. Berikut sedikit pengenalan bagaimana membuat desain hierarchy dalam SystemC TLM-2.0.  

Initiator dan target

Dalam TLM, kita mengenal istilah initiator dan target. Initiator adalah modul yang menginisiasi/mengawali transaksi, sedangkan target adalah yang menerima transaksi. Gambaran umumnya adalah seperti CPU menulis data ke RAM, dimana CPU adalah initiator, dan RAM adalah target. Initiator bisa dibungkus oleh modul initiator yang lain, begitu pula dengan target. Ini berguna jika ingin membuat desain dengan granularity yang jelas. 


Desain hierarchy pada gambar diatas dapat dibuat menggunakan library tlm_initiator_socket dan tlm_target_socket  dari tlm core interface. Kalau memakain tlm_utils, jangan lupa definisikan SC_INCLUDE_DYNAMIC_PROCESSES.

#define SC_INCLUDE_DYNAMIC_PROCESSES
#include "systemc.h"
#include "tlm/tlm.h"

struct initiator : sc_module {
tlm::tlm_initiator_socket<> init_socket;
SC_CTOR(initiator) : init_socket("init_socket")
{}
};

struct target : sc_module {
tlm::tlm_target_socket<> targ_socket;
SC_CTOR(target) : targ_socket("targ_socket")
{}
};

struct parent_of_initiator : sc_module {
tlm::tlm_initiator_socket<> init_socket;
initiator *INITIATOR;
SC_CTOR(parent_of_initiator) : init_socket("init_socket")
{
INITIATOR = new initiator("INITIATOR");
        INITIATOR->init_socket.bind(init_socket);
}
};

struct parent_of_target : sc_module {
tlm::tlm_target_socket<> targ_socket;
target *TARGET;
 SC_CTOR(parent_of_target) : targ_socket("targ_socket")
{
TARGET = new target("TARGET");
        targ_socket.bind(TARGET->targ_socket);
}
};

struct parent_of_initator_and_target : sc_module
{
tlm::tlm_initiator_socket<> init_socket;
tlm::tlm_target_socket<> targ_socket;
initiator *INITIATOR;
target *TARGET;
SC_CTOR(parent_of_initator_and_target) : init_socket("init_socket"), targ_socket("targ_socket")
{
INITIATOR = new initiator("INITIATOR");
TARGET = new target("TARGET");
  INITIATOR->init_socket.bind(init_socket);
  targ_socket.bind(TARGET->targ_socket);
}
};


Sebuah initiator juga bisa berfungsi sekaligus sebagai target. Ini sangat diperlukan ketika memodelkan interconnect component. Berikut implementasinya menggunakan simple_initiator_socket dan simple_target_socket.

struct initiator_target : sc_module {
tlm::tlm_initiator_socket<> init_socket;
tlm::tlm_target_socket<> targ_socket;
 SC_CTOR(initiator_target) : init_socket("init_socket"), targ_socket("targ_socket")
{}
};

struct parent_of_initiator_target : sc_module
{
tlm::tlm_initiator_socket<> init_socket;
tlm::tlm_target_socket<> targ_socket;
initiator_target *INITIATOR_TARGET;
SC_CTOR(parent_of_initiator_target): init_socket("init_socket"), targ_socket("targ_socket")
{
INITIATOR_TARGET = new initiator_target("INITIATOR_TARGET");
INITIATOR_TARGET->init_socket.bind(init_socket);
  targ_socket.bind(INITIATOR_TARGET->targ_socket);
}
};

TLM library dan source code pada contoh ini bisa didownload pada halaman Download. Sampai jumpa di tutorial TLM selanjutnya... Selamat mencoba.. ^^ (Ya2n)

Friday, March 11, 2011

Fixed-Point Modeling Menggunakan SystemC

Bernostalgia dengan LSI Design Contest in Okinawa 2007, saya kepikiran untuk mencoba membuat model FFT64-point yang ada dalam spec contest tersebut kedalam fixed-point di C/C++. Hal ini juga termotivasi dengan adanyya kebutuhan untuk memulai migrasi model fixed-point dari Octave/Matlab ke C/C++.

Tipe data fixed-point diperlukan dalam memodelkan hardware (chip) karena dalam harware representasi angka dibuat dalam satuan bit, misalnya angka 5 direpresentasikan dalam bit 101. Oleh karena jumlah bit terbatas, maka representasi angka terpaksa dibatasi juga, kalau hanya ada representasi angka dalam 2 bit, maka nilai 5 tidak ada, karena angka 5 membutuhkan representasi paling sedikit dalam 3 bit. Demikian halnya representasi angka rational dalam hardware, juga dibatasi oleh jumlah bit. Representasi angka rational dalam hardware biasanya dibuat dalam representasi fixed-point. Dengan representasi fixed-point ini, kita bisa memodelkan berbagai algoritma yang membutuhkan operasi rational seperti dalam algoritma FFT.

FFT (Fast Fourier Transform) adalah algoritma yang banyak digunakan dalam DSP (Digital Signal Processing), baik dalam image processing, audio/video, dan communication. Algoritma ini membutuhkan representasi nilai rational karena menggunakan operasi trigonometri seperti sinus dan cosinus. Dalam FFT, tidak hanya dibutuhkan fixed-point, tapi juga bilangan kompleks. Dalam C/C++, ada standard library complex tapi belum ada standard library fixed-point. Ada beberapa solusi dalam representasi fixed-point, beberapa diantaranya adalah library GNU MPFR dan SystemC. SystemC dipilih karena bahasa modeling ini sangat dekat dengan bahasa hardware (Verilog/VHDL) dan bahkan bisa di-mix dalam satu tool untuk mensimulasikannya.


Hasil percobaan menunjukkan bahwa model fixed-point FFT-64 di SystemC valid dan menunjukkan perilaku yang sama dengan model FFT64 dari library Matlab, pada konfigurasi fixed-point<10, 3>, tapi menunjukkan hasil yang berbeda ketika menggunakan konfigurasi fixed-point<10, 5> karena terjadi overflow (clipping). Gambar pertama adalah menggunakan Matlab library, gambar kedua adalah menggunakan fixed-point<10, 3>, gambar terkahir adalah menggunakan fixed-point<10, 5>.

Artikel selengkapnya bisa didownload pada halaman Download dengan judul FFT-64 Fixed-Point Modeling Using SystemC and User Defined Complex Datatypes. Selamat mencoba! ^^ (Ya2n)

Wednesday, March 9, 2011

Membuat User Define Complex Datatype menggunakan Operator Overloading di C/C++

(Updated 2011/03/11 - menambahkan fungsi abs() dan conj())

Dalam pemodelan DSP (Digital Signal Processing), tak jarang kita membutuhkan operasi bilangan kompleks, misal (2 + 3i) * (0.2 + 3.5i). Operasi seperti ini sangat mudah dilakukan di Matlab, seperti berikut ini:

>> (2 + 3i) * (0.2 + 3.5i)


ans=


  -10.1000 + 7.6000i

Tapi berbeda halnya ketika menggunakan C/C++. Tapi jangan kuatir, sekompleks apapun tipe data dan operasinya, bisa kita buat di C/C++. Tipe data complex sebenarnya sudah ada di standard library , namun dengan alasan interoperability, kita bisa buat sendiri tipe datanya. Misal, jika ingin menggabungkan library fix-point nya SystemC dengan tipe data kompleks.

Operator overloading.

Operator overloading memungkinkan kita untuk menggunakan operasi yang sama pada jenis tipe data yang berbeda dan menghasilkan hasil yang berbeda. Contoh ekstrimnya begini:

int a = 1;
int b = 2;
int c = a + b; // c = 3

Kode diatas akan menghasilkan nilai c = 3. Akan tetapi kalau kita memiliki tipe data lain yang ada operator overloading untuk operasi penjumlahan (+) nya, maka hasilnya bisa beda sesuai keinginnan kita. Misal:

tipe_buatan_sendiri a = 1;
tipe_buatan_sendiri b = 2;
tipe_buatan_sendiri c = a + b; // c = -1 (haha)

Kalau saya overload operator penjumlahannya menjadi: + adalah a - b, maka kode diatas akan menghasilkan nilai c = -1, karena c = a + b = a - b (karena operasi + saya overload menjadi -) = 1- 2 = -1. Haha, seems mad =)).. OK, itu contoh ekstrimnya, kita masuk ke implementasi real-nya pada tipe data kompleks.

Tipe data kompleks.

Tipe data kompleks memiliki anggota real dan imaginer, kita buat dulu struct-nya.

struct mycomplex_t {
  int real, imag;


  //constructor
  mycomplex_t(int init_real, int init_imag)
  {
    real = init_real;
    imag = init_imag;
  }
};

Sekarang kita punya tipe data mycomplex_t, dan langsung bisa kita gunakan:

mycomplex_t a(1, 2); //real = 1, imag = 2
cout << a.real; //print nilai real dari a, yaitu = 1
cout << a.imag; //print nilai real dari a, yaitu = 2

Kode mycomplex_t a(1, 2) akan memanggil struct mycomplex_t, dang menginisiasi nilai real dan imag yang ada di struct tersebut menggunakan constructor. Lalu kita tambahkan operator penjumlahan menggunakan operator overloading dan copy contsructor:

struct mycomplex_t {
  int real, imag;

  //constructor
  mycomplex_t(int init_real, int init_imag)
  {
    real = init_real;
    imag = init_imag;
  }

  //operasi penjumlahan
  mycomplex_t operator + (const mycomplex_t& rhs) {
    mycomplex_t t(0, 0);
    t.real = this->real + rhs.real;
    t.imag = this->imag + rhs.imag;
    return t;
  }

};

Dengan begini kita bisa lakukan operasi sebagai berikut:

mycomplex_t a(1, 2); //real = 1, imag = 2
mycomplex_t b(3, 4); //real = 3, imag = 4
mycomplex_t c(0, 0); //real = 0, imag = 0

c = a + b;

cout << c.real; //print nilai real dari c, yaitu = 4
cout << c.imag; //print nlai real dari c, yaitu = 6

OK, sampai disini kita sudah mempunyai tipe data kompleks buatan sendiri. Agar tipe data ini bisa dipakai sepenuhnya, kta lengkapi operasi-operasi yang mungkin dalam bilangan komplek:

1. + (penjumlahan)
2. - (pengurangan)
3. * (perkalian)
4. / (pembagian)
5. abs (absolut)
6. conj (konjugasi)
7. = (sama dengan)

Berikut operator overloadingnya:

  //operasi penjumlahan
  mycomplex_t operator + (const mycomplex_t& rhs) {
    mycomplex_t t;
    t.real = this->real + rhs.real;
    t.imag = this->imag + rhs.imag;
    return t;
  }

  //operasi pengurangan
  mycomplex_t operator + (const mycomplex_t& rhs) {
    mycomplex_t t;
    t.real = this->real - rhs.real;
    t.imag = this->imag - rhs.imag;
    return t;
  }

  //operasi perkalian
  mycomplex_t operator * (const mycomplex_t& rhs) {
    mycomplex_t t;
    t.real = (this->real * rhs.real) - (this->imag * rhs.imag);
    t.imag = (this->imag * rhs.real) + (this->real * rhs.imag);
    return t;
  }

  //operasi pembagian
  mycomplex_t operator / (const mycomplex_t& rhs) {
    mycomplex_t t;
    int div = ((rhs.real * rhs.real) + (rhs.imag * rhs.imag));
    t.real = ((this->real * rhs.real) + (this->imag * rhs.imag)) / div;
    t.imag = (this->imag * rhs.real) - (this->real * rhs.imag) / div;
    return t;
  }


  //operasi absolut
  mycomplex_t& abs()
  {
    int t;
    t = (this->real * this->real) + (this->imag * this->imag);
    float x1, x2;
    int i;
    while( (i*i) <= t )
          i+=0.1;
    x1=i;
    for(int j=0;j<10;j++)
    {
      x2=m;
      x2/=x1;
      x2+=x1;
      x2/=2;
      x1=x2;
    }
    return x2;    
  }

  //operasi konjugasi
  mycomplex_t& conj() {
    this->real = rhs.real;
    this->imag = - (rhs.imag);
    return *this;
  }



  //operasi sama dengan
  mycomplex_t& operator = (const mycomplex_t& rhs) {
    this->real = rhs.real;
    this->imag = rhs.imag;
    return *this;
  }

Sekarang, mari kita coba operasi-operasi tersebut:

mycomplex_t a(1, 2);
mycomplex_t b(3, 4);
mycomplex_t c(0, 0);

c = a + b;
c = a - b;
c = a * b;
c = a / b;
c = a.abs();
c = a.conj();

Bagaimana hasilnya? OK, bukan? Tapi tunggu dulu, sampai disini masih ada keanehan, kita harus inisiasi nilai tiap kali mau membuat variabel baru, padahal sebenarnya kita belum mengisi nilai variabel tersebut. Seperti dalam contoh: mycomplex_t c(0, 0). Hal ini karena constructor dalam struct-nya memakai parameter:

  //constructor
  mycomplex_t(int init_real, int init_imag)
  {
    real = init_real;
    imag = init_imag;
  }

Agar kita bisa membuat variabel dengan mycomplex_t c; saja, solusinya buat satu constructor lagi yang tanpa parameter tapi initial value-nya 0.

  //constructor
  mycomplex_t()
    : real(0), imag(0)
  {  }

Enjoy! (Ya2n)

Tuesday, March 8, 2011

Memanggil Code C di Python

Ketika seorang simulation coder sudah mulai meninggalkan tool matlab, maka penggunaan platform C/C++ menjadi alternatif yang cukup menjanjikan dengan tawaran kecepatan dan juga masalah opensource. Tapi masih ada kendala jika semua code dari matlab harus semua diterjemahkan ke dalam C/ C++ yaitu masalah library matlab yang sudah begitu sangat memanjakan engineer simulasi. Maka dari itu untuk melakukan proses migrasi ini akan lebih baik jika kita memanfaatkan kelebihan python sebagai jembatan antara C/C++/IT++ dengan matlab/octave.

Karena saya baru belajar mengenai hal ini (hari ini belajar bersama dengan yayan), maka saya akan mencoba sedikit share pengalaman bagaimana memanggil code C dari python. Mungkin bagi yang sudah terbiasa menggunakan python hal ini menjadi barang yang kecil, tapi meski begitu saya yakin masih banyak beberapa temen yang mungkin bisa mengambil manfaatnya.

1. Membuat code C sederhana.
misal code C-nya seperti ini :

#include
void hello(){
printf("hello, calling C from python is really easy (nek we ngerti rek..he he) \n");
}


kemudian code diatas bisa disimpan ke dalam file-name misalkan aja 'contoh.c'

2. Creating a shared library with the gnu compiler [gcc]
Shared libraries adalah libraries yang dipanggil oleh programs ketika mulai pertama kali. Shared library ini memungkinkan suatu object bisa di-share pada platform yang berbeda (misal python dan C). Untuk membuat 'object files' yang akan menjadi 'shared library' bisa menggunakan gcc -fPIC atau -fpic flag.
Berikut adalah contohnya (ketik di terminal linux):
>>> gcc -shared -fPIC contoh.c -o contoh.o
3. Loading dynamic link libraries
Untuk memanggil shared library yang sudah dibuat diatas kita bisa menggunaka 'ctypes'.
Ctypes akan meng-export 'cdll' untuk nge-load 'dynamic link libraries'.

sebagai contoh di script di python-nya bisa ditulis sebagai berikut :
>>> from ctypes import *
>>> libc = CDLL("./contoh.o")
>>> libc.hello() # hello disini pastikan sama dengan nama fungsi yang ada di code C/C++
kemudian save script python dalam top.py

4. Kemudian panggil python-nya dengan cara berikut (pastikan anda sudah menginstall python):
>>> python top.py

enjoy...

referensi
1. http://www.adp-gmbh.ch/cpp/gcc/create_lib.html
2. http://dalkescientific.com/writings/NBN/ctypes.html
3. http://docs.python.org/library/ctypes.html
4. http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html
5. http://mail.python.org/pipermail/baypiggies/2009-December/005918.html

Sunday, February 20, 2011

(Black+White = Grey) The Grey-Box Verification Flow

Ada tiga metode verifikasi: black-box, white-box, dan grey-box. Black-box adalah metode verifikasi dengan memberikan stimulus input kemudian melihat output dan membandingkannya dengan expected output dari golden reference model. White-box adalah metode verifikasi dengan memperhatikan detail dalam internal desain, seperti hierarki, data flow, state machine, counter, dan lainnya. Cara verifikasinya adalah memberikan stimulus input berupa random data, lalu memeriksa perilaku internal desain apakah sudah sesuai dengan perilaku yang diinginkan dalam desain, tanpa memperhatikan nilai output sama sekali. Kedua metode tersebut memiliki kelebihan dan kelemahan. Grey-box, berusaha menggabungkan kedua metode diatas, mengambil kelebihan keduanya, mengurangi kekurangan keduanya. Teknik verifikasi modern menerapkan combine-method ini.



Kunci suksesnya adalah ketersediaan tools yang mendukung HVL (high-level verification language) semacam SystemC dan SystemVerilog. Untungnya, hampir semua tools standard industri sudah menduking keduanya. Kesimpulan dari percobaan yang saya lakukan, grey-box verification memberikan solusi komprehensif dalam verifikasi dengan mampunya "attacking from both-sides", dan menemukan bug secepat mungkin dengan coverage seluas mugkin. Selain komprehensif, grey-box verification memungkinkan proses verifikasi lebih otomatis. Selain itu, grey-box verification memaksa golden reference model dibuat dalam C/C++ atau SystemC, dan bukan Matlab/Octave lagi, sehingga flow desain lainnnya terakomodiasi, seperti misalnya: early prototyping menggunakan DSP processor, GPU, dan early architectural exploration dengan menggunakan SystemC TLM.

Paper selengkapnya bisa didownload di halaman Download dengan judul: Grey Box Verification Flow, A Practical Guide. Selamat mencoba! (Ya2n)

Wednesday, January 19, 2011

Quartus Programmer Command Linux

1). login as root:

[mul@localhost]$ su

2). turn off selinux temporarily:

[root@localhost mul]# /usr/sbin/setenforce 0
[root@localhost mul]# chmod 777 -R /opt/altera9.1/

3) logout as root or using the other console :

[mul@localhost]$ quartus_pgm --cable="USB-Blaster [USB 3-1.3]" --mode=JTAG -o p\;name.sof

Semicolon under shells such as bash is a command separator. You should escape the semicolon with \

Thursday, January 13, 2011

Install Redmine (Open Source Web-based Project Management)

Dari sekian banyak open source web-based project management software, mungkin Redmine adalah yang paling keren. Pertama, ada fasilitas gantt chart, bisa konek ke SVN, support bug/issue tracking, dan punya plugin code review. Wow, komplit. Saya jadi tertarik mencobanya. Sebelumnya saya sudah pernah mencoba projectpier (yang paling simple) dan trac (lebih komplit dari projectpier), tapi keduanya memiliki kekurangan yang menbuat saya melirik ke Redmine. Development Redmine berbasis ruby, jadi akan banyak install ruby dan kawan-kawannya dulu.

Berikut langkah-langkah instalasi Redmine (case: Centos-5.4)

Step1: Install ruby

Saya pilih versi ruby versi 1.8.7.

$ cd /usr/local/src
$ wget http://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p72.tar.gz
$ tar -zxvf ruby-1.8.7-p72.tar.gz
$ cd ruby-1.8.7-p72
$ ./configure
$ make 
$ make install
$ ln /usr/local/bin/ruby /usr/bin/ruby

Ok, ruby sudah selesai diinstall, bisa dicek dengan "ruby -v". Sekarang kita install beberapa external library ruby yang dibutuhkan.

Pertama, zlib.
$ sudo yum install zlib zlib-devel
$ cd ext/zlib
$ ruby extconf.rb --with-zlib-include=/usr/include --with-zlib-lib=/usr/lib
$ cd ../../
$ make
$ make install

Kalau ada error di instalasi, saran saya "Googling", karena mungkin ada dependency yang belum ada di PC Anda.

Kedua, openssl
$ sudo yum install openssl openssl-devel
$ cd ext/openssl
$ ruby extconf.rb --with-openssl-include=/usr/include --with-openssl-lib=/usr/lib
$ make
$ make install


Nah, external library yang dibutuhkan selesai diinstall, sekarang ke tahap berikutnya, ruby sudah complete. Cek dengan perintah berikut:
$ ruby -ropenssl -rzlib -e "puts :success"

Jika library zlib tidak ada (contoh kasus di Debian), bisa coba pakai zlib1g, berikut yang saya lakukan, pertama install libray openssl, readline, dan zlib1g, baru install ruby dengan include path library tersebut:
$ apt-get -y install build-essential libssl-dev libreadline5-dev zlib1g-dev
$ cd ruby-1.8.7-p72
$ ./configure --prefix-/usr/local --with-openssl-dir=/usr --with-readline-dir=/usr --with-zlib-dir=/usr
$ make 
$ make install

Cek ulang hasil instalasi ruby (ruby -ropenssl -rzlib -e "puts :success")

Step2: Install rubygems

Saya pilih rubygems versi 1.3.6
$ cd /usr/local/src
$ wget http://rubyforge.org/frs/download.php/69365/rubygems-1.3.6.tgz
$ tar -zxvf rubygems-1.3.6.tgz
$ cd rubygems-1.3.6
$ ruby setup.rb

Instalasi rubygems selesai, bisa dicek dengan "gem -v". Untuk bisa mengupdate rubygems (optional), jalankan:
$ gem install rubygems-update
$ gem upadate --system

Sekarang kita akan install beberpa "gems" yang dibutuhakan.  Versi gem yang diinstall tergantung kebutuhan, yang saya install adalah versi-versi berikut:
$ gem install rails -v=2.1.2
$ gem install rack -v=1.0.1
$ gem install -v=0.4.2 i18n
$ gem install rmagick -v 1.15.13 
$ gem install mysql

Untuk instalasi gem-rmagick, ada beberapa library yang harus diinstall, yaitu "imagemagick". Pertanyaan selengkapnya mengenai instalasi rmagick bisa dilihat di http://rmagick.rubyforge.org/install-faq.html.
$ yum install install libmagick-dev

Untuk instalasi gem-mysql, library mysql-devel harus diinstall dulu.
$ sudo yum install mysql mysql-devel

Kalau mysql-devel tidak ada, bisa coba pakai libmysql++-dev (untuk kasus Debian)
$ apt-get install libmysql++-dev


Cek "gems" yang sudah terinstall, berikut "gems" yang ada di local repository saya:

$ gem list --local


*** LOCAL GEMS ***

abstract (1.0.0)
actionmailer (3.0.3, 2.1.2)
actionpack (3.0.3, 2.1.2)
activemodel (3.0.3)
activerecord (3.0.3, 2.1.2)
activeresource (3.0.3, 2.1.2)
activesupport (3.0.3, 2.1.2)
arel (2.0.6)
builder (2.1.2)
bundler (1.0.7)
erubis (2.6.6)
i18n (0.5.0, 0.4.2)
mail (2.2.14)
mime-types (1.16)
mysql (2.8.1)
polyglot (0.3.1)
rack (1.2.1, 1.0.1)
rack-mount (0.6.13)
rack-test (0.5.7)
rails (3.0.3, 2.1.2)
railties (3.0.3)
rake (0.8.7)
thor (0.14.6)
treetop (1.4.9)
tzinfo (0.3.23)

Step3: Setup MySQL database

Sebelumnya, kalau belum punya aplikasi LAMP (Linux,Apache,MySQL,PHP) install dulu LAMP-nya (silakan Googling :D). Setelah LAMP sudah terinstall, setup user dan database untuk redmine, silakan refer ke sini untuk setup user dan database-nya.

Untuk kali ini setup database berikut (sebagai contoh, Anda bisa setup dengan nama yang lain):
username: redmine
database: redmine_db
password: redmine_passwd

Step4: Install Redmine

Yang saya pakai adalah Redmine-1.0.5, untuk versi terbaru bisa checkout (SVN) dari http://redmine.rubyforge.org/svn/.
$ cd /opt
$ wget http://rubyforge.org/frs/download.php/73692/redmine-1.0.5.tar.gz
$ tar -zxvf redmine-1.0.5.tar.gz

Setup konfigurasi database Redmine MySQL.
$ cd redmine-1.0.5
$ cp config/database.yml.example 
config/database.yml

Edit bagian "production" menjadi seperti ini:
production:
  adapter: mysql
  database: redmine_db
  host: localhost
  username: redmine
  password: redmine_password
  encoding: utf8
  socket: /var/lib/mysql/mysql.sock

Jangan lupa tambahkan baris "mysql.sock"-nya. Untuk lebih pastinya, periksa /etc/my.cnf, dan perhatikan baris-baris berikut dan sesuaikan baris socket pada config/database.yml dengan socket pada /etc/my.cnf

[mysqld]
datadir=/usr/local/mysql/data
socket=/var/lib/mysql/mysql.sock

Setup konfigurasi Redmine Email. 
$ cp config/email.yml.example 
config/email.yml

Edit bagian "production" menjadi seperti ini:
production:
delivery_method: :smtp
smtp_settings:
tls: true
address: smtp.gmail.com
port: 587
domain: smtp.gmail.com
authentication: :plane
user_name: gmail_username
password: gmail_password

Load environement Redmine yang tadi sudah disetup.
$ rake config/initializers/session_store.rb
$ rake db:migrate RAILS_ENV="production"

Kalau ada error, bisa comment kesini atau "Googling" lagi, mungkin ada instalasi yang terlewat.

Jalankan web-server-nya, kita pakai WEBRick.
$ ruby script/server -e production

Kalau berhasil, buka website Redmine-nya (http://localhost:3000), dan halaman Welcome akan terlihat. Bisa masuk ke admin default dengan user: admin, password: admin

Berikut halaman welcome Redmine yang berhasil saya install. Voila!! Selamat mencoba =)