Hi Rob!

Glad you could test it working!

Err... The \ before the $ was neccessary in the bash version to not have it 
read as variable. I just copied the text over from there without thinking ;-)

Attached is the script with the \ removed, also in the generated files.

As I don't have write permission on the repo, I'd be grateful if you could do 
the commit.

Greets,
Kiste




Am Montag, 21. Dezember 2020, 18:36:30 MEZ hat Rob CJ <[email protected]> 
Folgendes geschrieben: 







Hi Kiste,




I ran the program, compiled 3 sample files of which I tested 2 and it all works 
perfectly. I also tested it for a very large array of 8k without any problems.




I propose we add both the python script and the large arrays to the release and 
remove the files you mentioned.




One small question: What is the '\' doing before the $Revision$ ?




Again great work. Shall I do the GitHub commits and changes (remove files from 
the release) for you?




Kind regards,




Rob





________________________________ 
Van: 'Oliver Seitz' via jallib <[email protected]>
Verzonden: maandag 21 december 2020 14:25
Aan: [email protected] <[email protected]>
Onderwerp: Re: [jallib] Large_array update 
 



Hi Rob,


so here it is. 


I've added some ifs to avoid warnings when defining small arrays on PIC14 cores.


:-D May I point out that it is not 2 files that are obsolete then, but these: 

large_byte_array_1_pic14.jal
large_byte_array_1_pic16.jal
large_byte_array_2_pic14.jal
large_byte_array_2_pic16.jal
large_byte_array_3_pic14.jal
large_byte_array_3_pic16.jal
large_byte_array_4_pic14.jal
large_byte_array_4_pic16.jal
large_dword_array_1_pic14.jal
large_dword_array_1_pic16.jal
large_dword_array_2_pic14.jal
large_dword_array_2_pic16.jal
large_dword_array_3_pic14.jal
large_dword_array_3_pic16.jal
large_dword_array_4_pic14.jal
large_dword_array_4_pic16.jal
large_word_array_1_pic14.jal
large_word_array_1_pic16.jal
large_word_array_2_pic14.jal
large_word_array_2_pic16.jal
large_word_array_3_pic14.jal
large_word_array_3_pic16.jal
large_word_array_4_pic14.jal
large_word_array_4_pic16.jal

Greets,
Kiste

-- 
You received this message because you are subscribed to the Google Groups 
"jallib" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/jallib/1908908800.3108533.1608573341279%40mail.yahoo.com.
# Title: Large Array library generation script
# Author: Oliver "Kiste" Seitz, copyright (c) 2009..2020, all rights reserved. 
# Adapted-by: 
# Interpreter: Python3
# Revision: $Revision$
#
# This file is part of jallib (https://github.com/jallib/jallib)
# Released under the ZLIB license (http://www.opensource.org/licenses/zlib-license.html)
#
# Description: This script generates the files
#              large_array_1.jal, large_array_2.jal...
#              
#
# Notes: The generated libraries are configurable. These values can be adjusted:
#
#   max_bytes_pic16=(58*256)
#       This value defines the maximum size of each array. As of 2020, 58 banks
#       of 256 bytes each is more than the largest PIC16 controller can have.
#       Limit is 255*256.
#   max_bytes_pic14=(60*80)
#       This value defines the maximum size of each array. As of 2020, 60 banks
#       of 80 bytes each is more than the largest PIC14 controller can have.
#       Limit is 255*80.
#   number_of_arrays=4
#       The original set of Large Array libs was designed to give up to four
#       arrays. Now, as the source is generated, the number can be increased
#       if needed.
#


# Configure the generated library
max_bytes_pic16=(58*256)
max_bytes_pic14=(60*80)
number_of_arrays=4

output_filename="large_array_{0}.jal"


# make sure the limits are multiples of four, round down if neccessary
max_bytes_pic16 = max_bytes_pic16 - (max_bytes_pic16 % 4)
max_bytes_pic14 = max_bytes_pic14 - (max_bytes_pic14 % 4)


# Define strings with quasi-static texts

prologue="""-- Title: Large Array_{7} library
-- Author: Oliver "Kiste" Seitz, copyright (c) 2009..2020, all rights reserved.
-- Based on work by Matthew Schinkel - borntechi.com and Rob Jansen 
-- Adapted-by: 
-- Compiler: >=2.5r4
-- Revision: $Revision$
--
-- This file is part of jallib (https://github.com/jallib/jallib)
-- Released under the ZLIB license (http://www.opensource.org/licenses/zlib-license.html)
--
-- Description: This library is for creating an array that take up more than one
--              GPR segment of memory. Works for PIC14(H) and PIC16 cores. It is 
--              a complete rewrite of the original large_array_{7} lib.
--
-- Sources: This file is generated by script: generate_large_array.py
--
-- Notes:
-- For controllers with PIC16 core (labeled PIC18(l)f...)
-- Supports byte array with up to {0} entries (LARGE_ARRAY_1_VARIABLE_SIZE = 1)
-- Supports word array with up to {1} entries (LARGE_ARRAY_1_VARIABLE_SIZE = 2)
-- Supports dword array with up to {2} entries (LARGE_ARRAY_1_VARIABLE_SIZE = 4)
--
-- For controllers with PIC14 core (labeled PIC16(l)f... or PIC12(l)f...)
-- Supports byte array with up to {3} entries (LARGE_ARRAY_1_VARIABLE_SIZE = 1)
-- Supports word array with up to {4} entries (LARGE_ARRAY_1_VARIABLE_SIZE = 2)
-- Supports dword array with up to {5} entries (LARGE_ARRAY_1_VARIABLE_SIZE = 4)
--
--
-- Creates an array named large_array_{7}
-- Use "alias new_array_name is large_array_{7}" to rename the array
-- 
--
-- Example:
-- const LARGE_ARRAY_{7}_SIZE = 600        -- choose number of array variables, not bytes
-- const LARGE_ARRAY_{7}_VARIABLE_SIZE = 2 -- choose size of variables (word)
-- include large_array_{7}                 -- include the array library
-- alias my_array is large_array_{7}       -- rename/alias the array to suit your program
--
-- Important: There is no range check on the index in the array.
--


-- Check for the target CPU
if ! defined(_large_array_core) then
   if (target_cpu == PIC_14H) | (target_cpu == PIC_14) then
      const _large_array_core=14
   elsif (target_cpu == PIC_16) then
      const _large_array_core=16
   else
      _ERROR "Large Array not supported for this PIC"
   end if
end if   

"""


newline="""
"""

address_decode_14_1="""
         var byte section

         -- The following lines do something like
         --
         --   section=address/80
         --   address=address%80
         --
         -- Not using divisions can save quite some code space (if there are no 
         -- divisions in the program yet, other than by powers of 2).
         -- Even if not saving code space, successive subtraction is often 
         -- faster in execution time. A sample program using divisions took more
         -- than three times the execution time.
      
         section=0
         if LARGE_ARRAY_{0}_SIZE >720 then
            while address_hi>=3 loop
               address=address-720
               section=section+9
            end loop   
         end if 

         if LARGE_ARRAY_{0}_SIZE >255 then
            while address_hi!=0 loop
               address=address-240
               section=section+3
            end loop   
         end if
         
         if LARGE_ARRAY_{0}_SIZE >=80 then
            while address_lo>=80 loop
               address_lo=address_lo-80
               section=section+1
            end loop
         end if 


"""


address_decode_14_2="""
         var byte section
         var bit address_lo_7 at address_lo:7

         -- The following lines do something like
         --
         --   section=address/40
         --   address=address%40
         --
         -- Not using divisions can save quite some code space (if there are no 
         -- divisions in the program yet, other than by powers of 2).
         -- Even if not saving code space, successive subtraction is often 
         -- faster in execution time. A sample program using divisions took more
         -- than three times the execution time.
      
         section=0
         if LARGE_ARRAY_{0}_SIZE >255 then
            while address_hi!=0 loop
               address=address-240
               section=section+6
            end loop   
         end if 

         if LARGE_ARRAY_{0}_SIZE >=128 then
            if address_lo_7 then
               address_lo=address_lo-120
               section=section+3
            end if
         end if 

         if LARGE_ARRAY_{0}_SIZE >=40 then
            while address_lo>=40 loop
               address_lo=address_lo-40
               section=section+1
            end loop
         end if 
    
"""


address_decode_14_4="""
         var byte section
         var bit address_lo_7 at address_lo:7

         -- The following lines do something like
         --
         --   section=address/20
         --   address=address%20
         --
         -- Not using divisions can save quite some code space (if there are no 
         -- divisions in the program yet, other than by powers of 2).
         -- Even if not saving code space, successive subtraction is often 
         -- faster in execution time. A sample program using divisions took more
         -- than three times the execution time.
      
         section=0

         if LARGE_ARRAY_{0}_SIZE >255 then
            while address_hi!=0 loop
               address=address-240
               section=section+12
            end loop   
         end if 

         if LARGE_ARRAY_{0}_SIZE >128 then
            if address_lo_7 then
               address_lo=address_lo-120
               section=section+6
            end if
         end if 

         if LARGE_ARRAY_{0}_SIZE >=60 then
            while address_lo>=60 loop
               address_lo=address_lo-60
               section=section+3
            end loop
         end if 

         if LARGE_ARRAY_{0}_SIZE >=20 then
            while address_lo>=20 loop
               address_lo=address_lo-20
               section=section+1
            end loop
         end if 
    
"""

address_decode_16_1="""
         var byte section at address_hi

"""

address_decode_16_2="""
         var byte section at address_hi

         address      =address   <<1          -- move the lo-byte's MSB to the hi-byte's LSB, i.e. 
         address_lo   =address_lo>>1          -- limit lo to 127, double hi and add carry

"""

address_decode_16_4="""
         var byte section at address_hi

         address      =address   <<2          -- move the two highest bits from lo to the low end of hi, i.e. 
         address_lo   =address_lo>>2          -- limit lo to 63, multiply hi by 4 and add carry

"""

read_function_prologue="""
      function large_array_{0}'get(word in address) return byte*{1} is
         var byte address_lo at address
         var byte address_hi at address+1
"""

write_procedure_prologue="""
      procedure large_array_{0}'put(word in address, byte*{1} in data) is
         var byte address_lo at address+0
         var byte address_hi at address+1
"""


# Define subroutines which actually generate parts of the files

def define_variables_per_core():

    target.write( "if defined(LARGE_ARRAY_{0}_SIZE) & (_large_array_core == {1}) then".format(output_counter,core))
    target.write(newline)
    target.write( "   if ! defined(LARGE_ARRAY_{0}_VARIABLE_SIZE) then".format(output_counter))
    target.write(newline)
    target.write( "      LARGE_ARRAY_{0}_VARIABLE_SIZE = 1                    -- default to byte*1".format(output_counter))
    target.write(newline)
    target.write( "   end if")
    target.write(newline)
    target.write( "   if (LARGE_ARRAY_{0}_VARIABLE_SIZE * LARGE_ARRAY_{0}_SIZE > {1}) then".format(output_counter,max_bytes))
    target.write(newline)
    target.write( "      _ERROR \"Large array only supports {0} bytes on this core\"".format(max_bytes))
    target.write(newline)
    target.write( "   end if")
    target.write(newline)
    
    for size_counter in [1,2,4]:
        target.write( "   if LARGE_ARRAY_{0}_VARIABLE_SIZE == {1} then".format(output_counter,size_counter) )
        target.write(newline)
        target.write( "      if LARGE_ARRAY_{0}_SIZE % {1} != 0 then ".format(output_counter,int(chunk_size/size_counter)) )
        target.write(newline)
        target.write( "         var byte*{1} _large_array_{0}_{1}_00[LARGE_ARRAY_{0}_SIZE % {2}]".format(output_counter,size_counter,int(chunk_size/size_counter)) )
        target.write(newline)
        target.write( "      else" )
        target.write(newline)
        target.write( "         var byte*{1} _large_array_{0}_{1}_00[{2}]".format(output_counter,size_counter,int(chunk_size/size_counter)) )
        target.write(newline)
        target.write( "      end if")
        target.write(newline)
        for run_counter in range(int((max_bytes/chunk_size))):
            target.write( "      var byte*{1} _large_array_{0}_{1}_{2:02d}[{3}]".format(output_counter,size_counter,run_counter+1,int(chunk_size/size_counter)))
            target.write(newline)
        target.write( "   end if" )    
        target.write(newline)
    target.write("end if")
    target.write(newline)


def define_variable_access():
    
    for size_counter in [1,2,4]:
        target.write(newline)
        target.write( "if defined(LARGE_ARRAY_{0}_SIZE) & (_large_array_core == {1}) then".format(output_counter,core,size_counter) )
        target.write(newline)
        target.write( "   if LARGE_ARRAY_{0}_VARIABLE_SIZE == {2} then".format(output_counter,core,size_counter) )
        target.write(newline)
        target.write(read_function_prologue.format(output_counter,size_counter))
        if core == 14 :
            if size_counter == 1:
                target.write( address_decode_14_1.format(output_counter) )
            elif size_counter == 2:
                target.write( address_decode_14_2.format(output_counter) )
            elif size_counter == 4:
                target.write( address_decode_14_4.format(output_counter) )
        if core == 16 :
            if size_counter == 1:
                target.write( address_decode_16_1.format(output_counter) )
            elif size_counter == 2:
                target.write( address_decode_16_2.format(output_counter) )
            elif size_counter == 4:
                target.write( address_decode_16_4.format(output_counter) )
                
            
        for variable_counter in range(1,int(max_bytes/chunk_size)+2):
            if variable_counter>1:
                target.write("         els")
            else:
                target.write("         ")
            target.write( "if LARGE_ARRAY_{0}_SIZE <= {1} then".format(output_counter,int(variable_counter*chunk_size/size_counter)) )
            target.write(newline)
            target.write( "            case section of")
            target.write(newline)
            
            for run_counter in range(variable_counter):
#                    target.write( "            {3:02d}:data = _large_array_{0}_{1}_{2:02d}[address_lo]".format(output_counter,size_counter,run_counter,variable_counter-run_counter-1))
#                    target.write( "            {3:02d}:return _large_array_{0}_{1}_{2:02d}[address_lo]".format(output_counter,size_counter,run_counter,variable_counter-run_counter-1))
                target.write( "               {3:02d}:return _large_array_{0}_{1}_{2:02d}[address_lo]".format(output_counter,size_counter,variable_counter-run_counter-1,run_counter))
                target.write(newline)
            target.write( "            end case" )
            target.write(newline)

        target.write("         end if")
        target.write(newline)
#            target.write("      return data")
#            target.write(newline)
        target.write("      end function")
        target.write(newline)
        target.write(write_procedure_prologue.format(output_counter,size_counter))
        if core == 14 :
            if size_counter == 1:
                target.write( address_decode_14_1.format(output_counter) )
            elif size_counter == 2:
                target.write( address_decode_14_2.format(output_counter) )
            elif size_counter == 4:
                target.write( address_decode_14_4.format(output_counter) )
        if core == 16 :
            if size_counter == 1:
                target.write( address_decode_16_1.format(output_counter) )
            elif size_counter == 2:
                target.write( address_decode_16_2.format(output_counter) )
            elif size_counter == 4:
                target.write( address_decode_16_4.format(output_counter) )
                
            
        for variable_counter in range(1,int(max_bytes/chunk_size)+2):
            if variable_counter>1:
                target.write("         els")
            else:
                target.write("         ")
            target.write( "if LARGE_ARRAY_{0}_SIZE <= {1} then".format(output_counter,int(variable_counter*chunk_size/size_counter)) )
            target.write(newline)
            target.write( "            case section of")
            target.write(newline)
            
            for run_counter in range(variable_counter):
#                    target.write( "            {3:02d}: _large_array_{0}_{1}_{2:02d}[address_lo] = data".format(output_counter,size_counter,run_counter,variable_counter-run_counter-1))
                target.write( "               {3:02d}: _large_array_{0}_{1}_{2:02d}[address_lo] = data".format(output_counter,size_counter,variable_counter-run_counter-1,run_counter))
                target.write(newline)
            target.write( "            end case" )
            target.write(newline)

        target.write("         end if")
        target.write(newline)
        target.write("      end procedure")
        target.write(newline)

        target.write("  end if")
        target.write(newline)
        target.write("end if")
        target.write(newline)

########################################################################################################################################
#####################################               MAIN PROGRAM               #########################################################
########################################################################################################################################

# Create the library file
for output_counter in range(1,number_of_arrays+1):

    target=open(output_filename.format(output_counter),'wt')

    target.write(prologue.format(max_bytes_pic16,int(max_bytes_pic16/2),int(max_bytes_pic16/4),max_bytes_pic14,int(max_bytes_pic14/2),int(max_bytes_pic14/4),number_of_arrays,output_counter ) ) 

    target.write("-- Define all arrays that might be used, the compiler will eliminate unused arrays automatically.")
    target.write(newline)
    chunk_size=80
    max_bytes=max_bytes_pic14
    core=14
    define_variables_per_core()

    chunk_size=256
    max_bytes=max_bytes_pic16
    core=16
    define_variables_per_core()

    target.write(newline)
    target.write( "-- Now define functions and procedures to read from and write to the sectional arrays.")
    target.write(newline)

    chunk_size=80
    max_bytes=max_bytes_pic14
    core=14
    define_variable_access()

    chunk_size=256
    max_bytes=max_bytes_pic16
    core=16
    define_variable_access()

    target.close()

    

Reply via email to