Thứ Ba, 19 tháng 3, 2019

[Perl][Thiết kế lõi IP bằng script] Bài 6 - Phân tích file excel để trích xuất thông tin cấu hình

Bài viết này giải thích chi tiết cách sử dụng Perl để đọc file excel lấy thông tin cấu hình sử dụng cho việc tạo ra RTL code. Đây là một trong các chức năng của TOOL "router_generator". Lưu ý, các bạn cần cài đặt các gói cần thiết phục vụ việc phân tich file excel đã trình bày trong bài 2. Bên cạnh đó, các thành phần cơ bản của TOOL cũng được trình bày trong bài 5.

1) Phân tích các bước hoạt động cơ bản của TOOL
Các chức năng, đồng thời cũng là các bước hoạt động chính của tool router_generator như sau:
  1. Trính xuất thông tin cấu hình: Bước này thực hiện đọc file excel cấu hình và lưu lại các giá trị cấu hình vào các biến để phục vụ quá trình tạo RTL code
  2. Tạo RTL code khối server: tạo ra một file RTL code hoàn chỉnh cho khối server ứng với các thông số cấu hình lấy từ file excel ở bước 1
  3. Tạo RTL code khối arbiter: tạo ra một file RTL code hoàn chỉnh cho khối arbiter ứng với các thông số cấu hình lấy từ file excel ở bước 1  
  4. Tạo RTL code khối router: router là module top. Bước này sẽ tạo ra một file RTL code, trong đó gọi hai module server và arbiter để tạo ra nhiều instance với số lượng như thông số cấu hình lấy từ file excel ở bước 1.
Hình 1: Flow chart tổng quát của tool
2) Bước 1 - Trích xuất thông tin cấu hình
Phần này phân tích chi tiết cách trích xuất thông tin cấu hình từ file excel. Việc dùng một file text, như .txt, giúp việc xử lý bằng Perl đơn giản hơn thì "Tại sao lại dùng file excel? Trong ví dụ đơn giản này, chúng ta không thấy rõ sự "lợi hại" của file excel nhưng tác giả vẫn dùng file excel để nếu các bạn có ý định áp dụng tạo RTL code cho một thiết kế lớn hơn thì sẽ rất hữu dụng. Một số lý do mà tác giả dùng file excel là vì:
  1. Tận dụng được điểm mạnh của excel là "tính toán". Điểm mạnh này sẽ giúp bạn tính toán thêm các giá trị, thông số liên quan hỗ trợ việc tạo RTL code dễ dàng hơn, giảm sự phức tạp của việc tính toán trong code Perl
  2. Việc trình bày, điền các thông tin vào từng ô (cell) trong file excel giúp người sử dụng dễ đọc và kiểm soát hơn. Giả sử lõi IP bạn cần tạo RTL code có rất nhiều thông số cấu hình, hàng chục đến hàng trăm thông số khác nhau, việc điền excel rõ ràng giúp dễ kiểm soát hơn
  3. Định dạng (format) tùy ý giúp tăng tính trực quan.
Nguyên tắc chung của việc trích xuất thông tin cấu hình từ file excel là:
  1. Đọc đúng giá trị ở vị trí ô (cell) đã quy định trước 
  2. Lưu giá trị đọc được vào các biến toàn cục để sử dụng cho các bước tiếp theo
Hình 2: Lưu các giá trị cấu hình vào các biến toàn cục của Perl
Các bạn có thể tải file excel cấu hình cho ví dụ này ở đây. File này tên router_spec.xls gồm 2 sheet:
  • Rev.History: Sheet chưa thông tin về phiên bản file
  • router_config: Sheet chứa thông tin cấu hình lõi IP
Dựa trên nguyên tắc trích xuất thông tin đã trình bày, tác giả tạo một file tên "get_config.pm". Đây là một package Perl có chức năng đọc giá trị cấu hình trong file excel ở sheet router_config.

Ví dụ 1: Nội dung file et_config.pm

#!/usr/bin/perl

###############################################################################
# Project:   RTL code generator
# Function:   Get the user configuration from an excel specification file
# Author:   nguyenquan.icd@gmail.com
# Website:   http://nguyenquanicd.blogspot.com
###############################################################################

use warnings;
use strict;
use Spreadsheet::ParseExcel;

package get_config;

my $filename = $ARGV[0] or die "Must specify filename to parse.\n";
my $parser   = Spreadsheet::ParseExcel->new();
my $workbook = $parser->parse( $filename );

if ( !defined $workbook ) {
    die "Parsing error: ", $parser->error(), ".\n";
}

#
my $worksheet = $workbook->worksheet('router_config');
print "1) Worksheet name: ", $worksheet->get_name(), "\n\n";

#Read all user parameters
my $addr_width_name = read_cell(2,1);
my $src_num_name    = read_cell(3,1);
my $ptr_width_name  = read_cell(4,1);
my $dest_num_name   = read_cell(6,1);
my $fifo_stage_name = read_cell(7,1);

our $addr_width = read_cell(2,3);
our $src_num    = read_cell(3,3);
our $ptr_width  = read_cell(4,3);
our $dest_num   = read_cell(6,3); #This is SEL_WIDTH
our $fifo_stage = read_cell(7,3);

print "\n  $addr_width_name = $addr_width\n";
print "  $src_num_name    = $src_num\n";
print "  $ptr_width_name  = $ptr_width\n";
print "  $dest_num_name   = $dest_num\n";
print "  $fifo_stage_name = $fifo_stage\n";
print "\n  COMPLETED GETTING PARAMETERS\n\n";
#
#subroutine
#
sub read_cell {
  my ($myrow, $mycol) = @_;
  #
  my $mycell = $worksheet->get_cell($myrow,$mycol);
  return ($mycell->value());
}

1;

Chức năng những dòng code quan trọng như sau:

1. Gọi sử dụng thư viện hàm phân tích file excel đã cài đặt
use Spreadsheet::ParseExcel;

2. Đặt tên package Perl
package get_config;

3. Đọc file excel từ lệnh chạy và kiểm tra file excel
my $filename = $ARGV[0] or die "Must specify filename to parse.\n";
my $parser   = Spreadsheet::ParseExcel->new();
my $workbook = $parser->parse( $filename );

if ( !defined $workbook ) {
    die "Parsing error: ", $parser->error(), ".\n";
}

4. Lấy thông tin đối tượng sheet "router_config"
my $worksheet = $workbook->worksheet('router_config');

5.  Đọc các cell ở cột B để lấy tên thông số cấu hình bằng subroutine read_cell
my $addr_width_name = read_cell(2,1);
my $src_num_name    = read_cell(3,1);
my $ptr_width_name  = read_cell(4,1);
my $dest_num_name   = read_cell(6,1);
my $fifo_stage_name = read_cell(7,1);

6. Đọc các cell ở cột D để lấy giá trị cấu hình và gán đến biến toàn cục bằng subroutine read_cell
our $addr_width = read_cell(2,3);
our $src_num    = read_cell(3,3);
our $ptr_width  = read_cell(4,3);
our $dest_num   = read_cell(6,3); #This is SEL_WIDTH
our $fifo_stage = read_cell(7,3);

7. In ra màn hình để kiểm tra
print "\n  $addr_width_name = $addr_width\n";
print "  $src_num_name    = $src_num\n";
print "  $ptr_width_name  = $ptr_width\n";
print "  $dest_num_name   = $dest_num\n";
print "  $fifo_stage_name = $fifo_stage\n";
print "\n  COMPLETED GETTING PARAMETERS\n\n";

8. Tạo subroutine read_cell để lấy thông tin từ các cell thông qua địa chỉ hàng (row) và cột (column)
sub read_cell {
  my ($myrow, $mycol) = @_;
  #
  my $mycell = $worksheet->get_cell($myrow,$mycol);
  return ($mycell->value());
}

Để hiểu rõ hơn:
  1. Đối với các từ khóa Perl, hãy tham khảo tài liệu số 4
  2. Đối với các từ khóa liên quan đến gói hỗ trợ phân tích file excel hay tham khảo tài liệu số 3
3) Kết quả
Để kiểm chứng kế quả, các bạn hãy thực thi lệnh sau trên terminal:

./get_config.pm router_spec.xls

Hình 3: Kết quả đọc cấu hình từ file router_spec.xls
Bài viết này đã mô tả script Perl đầu tiên dùng cho bước "Trích xuất thông tin cấu hình" trong tool router_generator. Các bạn hãy tìm hiểu và thử nghiệm trước khi đến với những hướng dẫn tiếp theo để tạo thành tool hoàn chỉnh.

Dữ liệu liên quan:
1. router_config.xls
2. get_config.pm
3. Tại liệu tra cứu method Perl cho việc phân tích file excel
4. Tài liệu Perl 21 ngày

Lịch sử cập nhật:
2019.Mar.19 - Tạo lần đầu

0 bình luận:

Đăng nhận xét