| line | stmt | bran | cond | sub | pod | time | code | 
| 1 |  |  |  |  |  |  | package VIC::PIC::Functions::CodeGen; | 
| 2 | 31 |  |  | 31 |  | 20433 | use strict; | 
|  | 31 |  |  |  |  | 47 |  | 
|  | 31 |  |  |  |  | 871 |  | 
| 3 | 31 |  |  | 31 |  | 114 | use warnings; | 
|  | 31 |  |  |  |  | 40 |  | 
|  | 31 |  |  |  |  | 1533 |  | 
| 4 |  |  |  |  |  |  | our $VERSION = '0.29'; | 
| 5 |  |  |  |  |  |  | $VERSION = eval $VERSION; | 
| 6 | 31 |  |  | 31 |  | 113 | use Carp; | 
|  | 31 |  |  |  |  | 36 |  | 
|  | 31 |  |  |  |  | 1774 |  | 
| 7 | 31 |  |  | 31 |  | 541 | use POSIX (); | 
|  | 31 |  |  |  |  | 4732 |  | 
|  | 31 |  |  |  |  | 633 |  | 
| 8 | 31 |  |  | 31 |  | 112 | use Moo::Role; | 
|  | 31 |  |  |  |  | 45 |  | 
|  | 31 |  |  |  |  | 200 |  | 
| 9 |  |  |  |  |  |  |  | 
| 10 |  |  |  |  |  |  | # default | 
| 11 |  |  |  |  |  |  | has org => (is => 'ro', default => 0); | 
| 12 |  |  |  |  |  |  | has code_config => (is => 'rw', default => sub { | 
| 13 |  |  |  |  |  |  | { | 
| 14 |  |  |  |  |  |  | debounce => { | 
| 15 |  |  |  |  |  |  | count => 5, | 
| 16 |  |  |  |  |  |  | delay => 1000, # in microseconds | 
| 17 |  |  |  |  |  |  | }, | 
| 18 |  |  |  |  |  |  | adc => { | 
| 19 |  |  |  |  |  |  | right_justify => 1, | 
| 20 |  |  |  |  |  |  | vref => 0, | 
| 21 |  |  |  |  |  |  | internal => 0, | 
| 22 |  |  |  |  |  |  | }, | 
| 23 |  |  |  |  |  |  | variable => { | 
| 24 |  |  |  |  |  |  | bits => 8, # bits. same as register_size | 
| 25 |  |  |  |  |  |  | export => 0, # do not export variables | 
| 26 |  |  |  |  |  |  | }, | 
| 27 |  |  |  |  |  |  | string => { | 
| 28 |  |  |  |  |  |  | size => 32, # character allocation of null strings | 
| 29 |  |  |  |  |  |  | }, | 
| 30 |  |  |  |  |  |  | uart => { | 
| 31 |  |  |  |  |  |  | baud => 9600, # baud rate | 
| 32 |  |  |  |  |  |  | bit9 => 0, # allow 9 bits | 
| 33 |  |  |  |  |  |  | }, | 
| 34 |  |  |  |  |  |  | usart => { | 
| 35 |  |  |  |  |  |  | baud => 9600, # baud rate | 
| 36 |  |  |  |  |  |  | bit9 => 0, # allow 9 bits | 
| 37 |  |  |  |  |  |  | }, | 
| 38 |  |  |  |  |  |  | } | 
| 39 |  |  |  |  |  |  | }); | 
| 40 |  |  |  |  |  |  |  | 
| 41 |  |  |  |  |  |  | sub validate { | 
| 42 | 227 |  |  | 227 | 0 | 1070 | my ($self, $var) = @_; | 
| 43 | 227 | 50 |  |  |  | 445 | return undef unless defined $var; | 
| 44 | 227 | 100 |  |  |  | 810 | return 0 if $var =~ /^\d+$/; | 
| 45 | 216 | 50 |  |  |  | 919 | return 0 unless $self->doesrole('Chip'); | 
| 46 | 216 | 100 |  |  |  | 1376 | return 1 if exists $self->pins->{$var}; | 
| 47 | 75 | 100 |  |  |  | 517 | return 1 if exists $self->registers->{$var}; | 
| 48 | 30 | 50 | 33 |  |  | 79 | return 1 if ($self->doesrole('Timer', 1) and exists $self->timer_pins->{$var}); | 
| 49 | 30 | 100 | 33 |  |  | 73 | return 1 if ($self->doesrole('Timer', 1) and exists $self->wdt_prescaler->{$var}); | 
| 50 | 29 | 100 | 33 |  |  | 67 | return 1 if ($self->doesrole('USART', 1) and exists $self->usart_pins->{$var}); | 
| 51 | 9 |  |  |  |  | 33 | return 0; | 
| 52 |  |  |  |  |  |  | } | 
| 53 |  |  |  |  |  |  |  | 
| 54 |  |  |  |  |  |  | sub validate_operator { | 
| 55 | 133 |  |  | 133 | 0 | 493 | my ($self, $op) = @_; | 
| 56 | 133 | 50 |  |  |  | 514 | my $vop = "op_$op" if $op =~ /^ | 
| 57 |  |  |  |  |  |  | LE | GE | GT | LT | EQ | NE | | 
| 58 |  |  |  |  |  |  | ADD | SUB | MUL | DIV | MOD | | 
| 59 |  |  |  |  |  |  | BXOR | BOR | BAND | AND | OR | SHL | SHR | | 
| 60 |  |  |  |  |  |  | ASSIGN | INC | DEC | NOT | COMP | | 
| 61 |  |  |  |  |  |  | TBLIDX | ARRIDX | STRIDX | 
| 62 |  |  |  |  |  |  | /x; | 
| 63 | 133 | 50 |  |  |  | 378 | return lc $vop if defined $vop; | 
| 64 |  |  |  |  |  |  | } | 
| 65 |  |  |  |  |  |  |  | 
| 66 |  |  |  |  |  |  | sub validate_modifier_operator { | 
| 67 | 16 |  |  | 16 | 0 | 92 | my ($self, $mod) = @_; | 
| 68 | 16 | 100 |  |  |  | 93 | my $vmod = "op_$mod" if $mod =~ /^ | 
| 69 |  |  |  |  |  |  | SQRT | HIGH | LOW | 
| 70 |  |  |  |  |  |  | /x; | 
| 71 | 16 | 100 |  |  |  | 76 | return lc $vmod if defined $vmod; | 
| 72 |  |  |  |  |  |  | } | 
| 73 |  |  |  |  |  |  |  | 
| 74 |  |  |  |  |  |  | sub update_code_config { | 
| 75 | 20 |  |  | 20 | 0 | 105 | my ($self, $grp, $key, $val) = @_; | 
| 76 | 20 | 50 |  |  |  | 160 | return unless $self->doesrole('CodeGen'); | 
| 77 | 20 | 50 |  |  |  | 57 | return unless defined $grp; | 
| 78 | 20 |  |  |  |  | 35 | $grp = lc $grp; # force lower case in case of usage for things like SPI/UART/I2C | 
| 79 | 20 | 100 |  |  |  | 94 | $self->code_config->{$grp} = {} unless exists $self->code_config->{$grp}; | 
| 80 | 20 |  |  |  |  | 40 | my $grpref = $self->code_config->{$grp}; | 
| 81 | 20 | 100 |  |  |  | 46 | if ($key eq 'bits') { | 
| 82 | 2 | 50 |  |  |  | 5 | $val = 8 unless defined $val; | 
| 83 | 2 | 50 |  |  |  | 6 | $val = 8 if $val <= 8; | 
| 84 | 2 | 50 | 33 |  |  | 7 | $val = 16 if ($val > 8 and $val <= 16); | 
| 85 | 2 | 50 | 33 |  |  | 6 | $val = 32 if ($val > 16 and $val <= 32); | 
| 86 | 2 | 50 |  |  |  | 4 | carp "$val-bits is not supported. Maximum supported size is 64-bit" | 
| 87 |  |  |  |  |  |  | if $val > 64; | 
| 88 | 2 | 50 |  |  |  | 4 | $val = 64 if $val > 32; | 
| 89 |  |  |  |  |  |  | } | 
| 90 | 20 | 100 |  |  |  | 54 | $val = 1 unless defined $val; | 
| 91 | 20 | 50 |  |  |  | 52 | if (ref $grpref eq 'HASH') { | 
| 92 | 20 |  |  |  |  | 38 | $grpref->{$key} = $val; | 
| 93 |  |  |  |  |  |  | } else { | 
| 94 | 0 |  |  |  |  | 0 | $self->code_config->{$grp} = { $key => $val }; | 
| 95 |  |  |  |  |  |  | } | 
| 96 | 20 |  |  |  |  | 44 | 1; | 
| 97 |  |  |  |  |  |  | } | 
| 98 |  |  |  |  |  |  |  | 
| 99 |  |  |  |  |  |  | sub address_bits { | 
| 100 | 257 |  |  | 257 | 0 | 1483 | my ($self, $varname) = @_; | 
| 101 | 257 | 50 |  |  |  | 481 | return unless $self->doesrole('CodeGen'); | 
| 102 | 257 |  |  |  |  | 575 | my $bits = $self->code_config->{variable}->{bits}; | 
| 103 | 257 | 50 |  |  |  | 416 | return $bits unless $varname; | 
| 104 | 257 |  | 33 |  |  | 1015 | $bits = $self->code_config->{lc $varname}->{bits} || $bits; | 
| 105 | 257 |  |  |  |  | 562 | return $bits; | 
| 106 |  |  |  |  |  |  | } | 
| 107 |  |  |  |  |  |  |  | 
| 108 |  |  |  |  |  |  | sub is_variable { | 
| 109 | 5 |  |  | 5 | 0 | 10 | my ($self, $varname) = @_; | 
| 110 | 5 | 50 |  |  |  | 11 | return unless $varname; | 
| 111 | 5 | 50 |  |  |  | 12 | return unless $self->doesrole('CodeGen'); | 
| 112 | 5 | 100 |  |  |  | 36 | return 1 if defined $self->code_config->{lc $varname}; | 
| 113 | 1 |  |  |  |  | 3 | return 0; | 
| 114 |  |  |  |  |  |  | } | 
| 115 |  |  |  |  |  |  |  | 
| 116 |  |  |  |  |  |  |  | 
| 117 |  |  |  |  |  |  | 1; | 
| 118 |  |  |  |  |  |  | __END__ |