Friday, April 27, 2012

Setting Flag /SUBSYSTEM di Visual Studio 2010 Menggunakan CMake

Ketika membuat software GUI di Visual Studio 2010, sering kali kita membutuhkan untuk mengeset flag /SUBSYSTEM ke WINDOWS agar aplikasi tidak mengeluarkan spash screen console ketika dijalankan, terutama ketika ingin build sistem ke Release.

Solusi:
Agar CMake dapat melakukan setting flag /SUBSYSTEM ke Windows, tambahkan WIN32 pada ADD_EXECUTABLE:

ADD_EXECUTABLE(${TARGET} WIN32 ${SOURCE})

Problem:
Pada saat yang sama, kita juga ingin mengeset flag /SUBSISTEM ke CONSOLE untuk memudahkan debugging (dengan printf tentunya). Cara diatas akan membuat /SUBSYSTEM diset ke WINDOWS walaupun tipe build adalah Debug.

Sayangnya, ini memang kekurangan yang ada di CMake (lihat http://public.kitware.com/Bug/view.php?id=12566). Setidaknya sampai saat tulisan ini dibuat, bugs-nya belum closed.

Thursday, April 12, 2012

Tutorial Singkat LEDA


Hari ini saya berdiskusi dengan tim yang menemui problem pada implementasi FPGA. Desain RTL yang dia buat, jika diimplementasi di Spartan 3 (Xilinx) berjalan dengan baik, tapi jika diimplementasi di Spartan 6 gagal. Itu berarti netlist hasil sintesis ke Spartan 6 berbeda dengan Spartan 3.

Hal ini bisa terjadi karena beberapa hal, misalnya compile (ISE) salah menginterpretasi logic desain RTL-nya (hehe :D), atau mungkin juga karena coding style RTL-nya tidak type-save sehingga memungkinkan terjadinya perbedaan hasil simulasi dengan sintesis, atau ketidakkonsistenan hasil sintesis. Beberapa tulisan telah membahas hal ini dan salah satunya ada di http://www.eda.org/vlog-synth/Mills_Final.pdf

Saya jadi teringat LEDA, tools untuk mengecek RTL coding style dan mendeteksi kemungkinan terjadinya synthesis missmacth tanpa harus melakukan sintesis. Tutorial LEDA pernah saya tulis di http://yansyafri.wordpress.com/2007/11/20/leda-rtl-checker/. Berikut saya copas kembali.



Saat men-synthesis desain baik kadalam device ASIC maupun FPGA terkadang kita temui error atau warning yang tidak didapatkan ketika proses simulasi dan verifikasi baik di ModelSim, VCS, ataupun tool RTL simulation lainnya. Hal ini dikarenakan tool RTL simulation hanya menggunakan library verilog IEEE sebagai rujukan, sedangkan pada target device keadaanya adalah kasuistik tergantung devicenya itu sendiri. Hal ini menjadi botle-neck ketika desainer belum berpengalaman pada target device tersebut (saat synthesis muncul banyak error), mengingat proses synthesis memakan waktu yang cukup lama.

Synopsys menyediakan tools khusus untuk mengatasi masalah ini: LEDA. Tools ini mampu menge-check code RTL (verilog atau VHDL) berdasarkan library dari target device yang akan kita pakai (misalnya Xilinx, Altera, TSMC, MOSIS), yaitu dengan cara meng-include-kan file library *.db

Untuk memulai menggunakan LEDA, berikut adalah tutorial singkatnya, semoga bermanfaat.

1. Setting environtment Synopsys-nya terlebih dahulu.

yayan@aquila:~> source /usr/local/CAD/Synopsys/setting_aquila.sh

2. Buat folder kerja LEDA, lalu buat script TCL-nya.

yayan@aquila:~/wimax/trunks/phy/verilog/leda/receiver> emacs receiver_leda.tcl &

Berikut contohscript TCL-nya mulai dari (#include):

#include file or library path
set search_path "../../integrated \
../../inc \"

#verilog file compile
read_verilog ../../../../phy/verilog/integrated/receiverTop.v

#top level module
current_design -work receiverTop

#you can select or deselect rules here, format:
#rule_deselect/rule_select –policy [policy_name] –rule [rule_name]
rule_deselect –policy DC –rule DCHDL_115

#check syntax
check

#log file dumped into ./leda-logs/checker.log
report

# quit leda shell
quit

Deskripsi rules dapat dilihat di $/leda/Z200709/doc/user.pdf pada section C Leda Prebuilt Configuration (terdapat tabel nama rule, policy-nya, dan deskripsinya). Deskripsi warning atau error saat compilation atau elaboration dapat dilihat pada section E Error And Warning Message List. Beberapa message bisa dihilangkan jika tidak dibutuhkan (lihat Deselecteble Messages pada Section E) tambahkan script berikut pada TCL.

rule_deselect –rule [label]

3. Jalankan script TCL-nya.

yayan@aquila:~/wimax/trunks/phy/verilog/leda/receiver> leda +tcl_file receiver_leda.tcl

4. Selamat mencoba (ya2n).

Catatan tambahan:
- Ada tools lain yang dapat dipakai untuk melakukan equivalence check, yaitu Formality.
- Equivalence check adalah mengetes kesesuiaian logic hasil sintesis (netlist) dengan RTL menggunakan metode formal checking.
- Link: http://www.synopsys.com/tools/verification/formalequivalence/pages/formality.aspx

Friday, April 6, 2012

Simple Example PHP - MySQL

MySQL adalah salah satu relational database management system (RDBMS) berbasis SQL (Structured Query Language) yang paling populer dan banyak digunakan. MySQL dapat dipakai pada aplikasi web maupun software pada desktop.

Kepopuleran MySQL terutama karena dipakai pada aplikasi web yaitu yang lebih dikenal dengan aplikasi LAMP (Linux-Apache-MySQL-Perl/PHP/Python). Untuk menggunakan MySQL pada web, dibutuhkan PHP untuk men-submit command-command MySQL. Command-command pada MySQL disebut dengan Query.

Berikut adalah contoh simpel memakai MySQL dalam PHP bagi pemula.Contoh berikut menggunakan dua jenis query dasar yang banyak digunakan yaitu:

- Create table
- Insert row

Ada tiga file PHP yang kita butuhkan:
- index.php (untuk halaman muka sekaligus create table)
- insert.php (untuk melakukan query insert)
- show.php (untuk mendisplay isi database MySQL ke halaman web)



File: index.php

<?php

$con = mysql_connect("localhost","databasename","databasepassword");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

// Create database
if (mysql_query("CREATE DATABASE databasename",$con))
  {
  echo "Database created";
  }
else
  {
  echo "Error creating database: " . mysql_error();
  }

// Create table
mysql_select_db("databasename", $con);
$sql = "CREATE TABLE wi_1 
(
personID int NOT NULL AUTO_INCREMENT, 
PRIMARY KEY(personID),
Nama varchar(15),
Alamat varchar(15),
Telp int,
Email varchar(15)
)";

// Execute query
mysql_query($sql,$con);

//mysql_close($con);

?> 
 <html>
 <body>

 <form action="insert.php" method="post">

 <br>Nama: <input type="text" name="nama" />
 <br>Alamat: <input type="text" name="alamat" />
 <br>Telp: <input type="text" name="telp" />
 <br>Email: <input type="text" name="email" />
 <br><input type="submit" />

 </form>

 </body>
 </html>

File index.php terdiri dari dua bagian: yang berisi code php dan yang berisi code html. Bagian yang berisi php berfungsi untuk meng-connect ke MySQL server dan membuat database baru dengan kolom: Nama, Alamat, Telp, dan Email. Sedangkan bagian html berfungsi untuk menampilkan form yang isinya dipakai dalam MySQL query dengan perantara PHP. Perhatikan username, password, dan databasename harus benar.

File: insert.php

<?php
$con = mysql_connect("localhost","databasename","databasepassword");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("databasename", $con);

$sql="INSERT INTO wi_1 (Nama, Alamat, Telp, Email)
VALUES
('$_POST[nama]','$_POST[alamat]','$_POST[temp]','$_POST[email]')";

if (!mysql_query($sql,$con))
  {
  die('Error: ' . mysql_error());
  }
echo "1 record added";

mysql_close($con);
?>

File insert.php berfungsi mengambil data dari isi form yaitu: nama, alamat, telp, dan email untuk dipakai dalam MySQL query.

File: show.php

<?php
$con = mysql_connect("localhost","airqecom_data","muhammad");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("airqecom_data", $con);

$result = mysql_query("SELECT * FROM wi_1");

echo "<table border='1'>
<tr>
<th>Nama</th>
<th>Alamat</th>
<th>Temp</th>
<th>Email</th>
</tr>";

while($row = mysql_fetch_array($result))
  {
  echo "<tr>";
  echo "<td>" . $row['nama'] . "</td>";
  echo "<td>" . $row['alamat'] . "</td>";
  echo "<td>" . $row['Telp'] . "</td>";
  echo "<td>" . $row['Email'] . "</td>";  
  echo "</tr>";
  }
echo "</table>";

mysql_close($con);
?>

File show.php berfungsi untuk mengambil data dari MySQL database menggunakan query fecth, lalu menampilkan datanya dalam HTML.

Simpel bukan? Selamat mencoba!

Catatan:
- Cara menampilkan code pada halaman blog saya dapatkan dari http://thoughtsomething.blogspot.com/2008/11/display-html-javascript-code-in-blogger.html

Thursday, April 5, 2012

How to Solve Error GLIBCXX_3.4.xx Not Found in Matlab Ubuntu

Untuk mengcompile kode matlab (.m) ke shared library (.dll atau .so), seperti yang telah dijelaskan di postingan sebelumnya, akan muncul error berikut di Ubuntu 10.4 atau versi lebih baru:



Warning: You are using gcc version "4.5.2-8ubuntu4)".  The earliest gcc version supported
with mbuild is "4.0.0".  The latest version tested for use with mbuild is "4.2.3".
To download a different version of gcc, visit http://gcc.gnu.org 
/usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.5.2/cc1: /opt/matlab/sys/os/glnxa64/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by /usr/lib/libppl_c.so.2)
/usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.5.2/cc1: /opt/matlab/sys/os/glnxa64/libstdc++.so.6: version `GLIBCXX_3.4.11' not found (required by /usr/lib/libppl_c.so.2)
/usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.5.2/cc1: /opt/matlab/sys/os/glnxa64/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by /usr/lib/libppl.so.7)
/usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.5.2/cc1: /opt/matlab/sys/os/glnxa64/libstdc++.so.6: version `GLIBCXX_3.4.11' not found (required by /usr/lib/libppl.so.7)
/usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.5.2/cc1: /opt/matlab/sys/os/glnxa64/libstdc++.so.6: version `GLIBCXX_3.4.11' not found (required by /usr/lib/libgmpxx.so.4)

Hal ini disebabkan karena Matlab mem-bundled software-nya dengan versi Gcc yang lama dan tidak kompatibel dengan versi Gcc yang dipakai Ubuntu.

Cara mengatasinya:

- Cukup hilangkan atau rename file yang error tersebut dari folder instalasi Matlab, dengan sendirinya yang dipakai adalah yang ada di Ubuntu :D

Contoh:
mv /opt/matlab/sys/os/glnxa64/libstdc++.so.6 /opt/matlab/sys/os/glnxa64/libstdc++.so.6.BAK