the three assumptions you mentioned are accurate
If you're really sure about the indentation something like that can help :
use strict;
use warnings;
use v5.10;
my $data = do { local $/; <DATA> };
my @sections = split /(\s{4}pin.*?\s{4}\})/s, $data;
for (@sections)
{
say;
say '-' x 24;
}
__END__
cell (lib_1) {
dont_use : true ;
dont_touch : true ;
pin ("HIZIBI_IN_1") {
direction : input ;
clock : true ;
max_transition : 1 ;
capacitance : 12 ;
}
pin ("HIZIBI_79") {
direction : output ;
max_transition : 10;
min_capacitance : 3 ;
}
pin ("HIZIBI_IN_1") {
direction : input ;
clock : true ;
max_transition : 1 ;
capacitance : 1 ;
}
pin ("HIZIBI_78") {
direction : output ;
max_transition : 10;
min_capacitance : 34 ;
capacitance : 34 ;
}
pin ("HIZIBI") {
direction : output ;
clock : true ;
max_transition : 20;
related_power_pin : VDD ;
related_ground_pin : VSS ;
timing () {
cell_fall (into_f1) {
index_1("1,2,3,4,5") ;
index_2("1,2,3,4,5") ;
values("13, 13, 14, 16, 18",\
"13, 14, 15, 16, 19",\
"14, 15, 16, 17, 20",\
"15, 15, 16, 18, 20",\
"15, 16, 17, 18, 21") ;
}
}
}
}
It's very rough, and assumes a very consistent indentation. It divides the input into section (even empty ones between the pins but that shouldn't be an issue):
cell (lib_1) {
dont_use : true ;
dont_touch : true ;
------------------------
pin ("HIZIBI_IN_1") {
direction : input ;
clock : true ;
max_transition : 1 ;
capacitance : 12 ;
}
------------------------
------------------------
pin ("HIZIBI_79") {
direction : output ;
max_transition : 10;
min_capacitance : 3 ;
}
------------------------
------------------------
pin ("HIZIBI_IN_1") {
direction : input ;
clock : true ;
max_transition : 1 ;
capacitance : 1 ;
}
------------------------
------------------------
pin ("HIZIBI_78") {
direction : output ;
max_transition : 10;
min_capacitance : 34 ;
capacitance : 34 ;
}
------------------------
------------------------
pin ("HIZIBI") {
direction : output ;
clock : true ;
max_transition : 20;
related_power_pin : VDD ;
related_ground_pin : VSS ;
timing () {
cell_fall (into_f1) {
index_1("1,2,3,4,5") ;
index_2("1,2,3,4,5") ;
values("13, 13, 14, 16, 18",\
"13, 14, 15, 16, 19",\
"14, 15, 16, 17, 20",\
"15, 15, 16, 18, 20",\
"15, 16, 17, 18, 21") ;
}
------------------------
}
}
}
------------------------
Edit: it also assumes that the file is not so big that you can't read it all at once. |