Author: sebastien.lelong
Date: Sat Oct 18 01:29:20 2008
New Revision: 422

Added:
    trunk/tools/testing_matrix.tmpl
    trunk/unvalidated/sample/testing_matrix.yaml
Modified:
    trunk/tools/jallib

Log:
"jallib test" handles the testing matrix, see help

Modified: trunk/tools/jallib
==============================================================================
--- trunk/tools/jallib  (original)
+++ trunk/tools/jallib  Sat Oct 18 01:29:20 2008
@@ -14,7 +14,14 @@
  # Description: this script handles common tasks when using the jallib SVN  
repository
  # `jallib help` for more !
  #
-#
+# Dependencies: according to the following actions, you'll need to install  
the
+# following libraries (if you don't use the action, you can skip it)
+# - jalv2 executable (compile): http://www.casadeyork.com/jalv2
+# - wikify (jalapi): http://cspace.googlecode.com/svn/wiki/wikify.py
+# - Cheetah (jalapi): http://cheetahtemplate.org
+# - yaml (test): http://pyyaml.org/wiki/PyYAML
+# - pysvn (jalapi,test): http://pysvn.tigris.org/
+#
  # Notes:
  #

@@ -24,6 +31,21 @@
  import re


+#########
+# TOOLS #
+#########
+
+def get_jal_filenames(dir):
+       jalfiles = []
+       for df in os.listdir(dir):
+               if df.startswith("."):
+                       continue
+               fulldf = os.path.join(dir,df)
+               if os.path.isfile(fulldf) and fulldf.endswith(".jal"):
+                       jalfiles.append(df)
+               else:
+                       jalfiles.extend(get_jal_filenames(fulldf))
+       return jalfiles


  ################
@@ -71,7 +93,7 @@

        # There's not even an argument for the compiler...
        if not original_args:
-               print "Missing arguments to jalv2 compiler..."
+               print >> sys.stderr, "Missing arguments to jalv2 compiler..."
                sys.exit(255)
        
        # Try to extract jallib args
@@ -88,7 +110,7 @@
                args = list(set(original_args).difference(set(jallib_args)))
        

-       jalv2_exec = "jalv2"
+       jalv2_exec = None
        dirs = None
        for o,v in opts:
                if o == '-R':
@@ -99,13 +121,16 @@
                elif o == '-E':
                        jalv2_exec = v
                else:
-                       print "Wrong option %s" % o
+                       print >> sys.stderr, "Wrong option %s" % o
        # No root specified ? Try env var, else defaut to cwd
        if not dirs:
                v = os.environ.get('JALLIB_REPOS',os.path.curdir)
                gdirs = v.split(":")
                for d in gdirs:
                        dirs = _explore_dir(d)
+       # No exec specify, try env var or defaulting
+       if not jalv2_exec:
+               jalv2_exec = os.environ.get('JALLIB_JALV2','jalv2')
        cmd = [jalv2_exec,"-s",";".join(dirs)]
        # Complete with compiler args
        if args:
@@ -114,7 +139,7 @@
        try:
                status = subprocess.check_call(cmd,shell=False)
        except subprocess.CalledProcessError,e:
-               print "Error while compiling file (status=%s). See previous 
message." %  
e.returncode
+               print >> sys.stderr, "Error while compiling file (status=%s). 
See  
previous message." % e.returncode
                sys.exit(e.returncode)
        pass

@@ -317,14 +342,14 @@


  def report(filename):
-       print "File: %s" % filename
-       print "%d errors found" % len(errors)
+       print >> sys.stderr, "File: %s" % filename
+       print >> sys.stderr, "%d errors found" % len(errors)
        for err in errors:
-               print "\tERROR: %s" % err
-       print
-       print "%d warnings found" % len(warnings)
+               print >> sys.stderr, "\tERROR: %s" % err
+       print >> sys.stderr
+       print >> sys.stderr, "%d warnings found" % len(warnings)
        for warn in warnings:
-               print "\twarning: %s" % warn
+               print >> sys.stderr, "\twarning: %s" % warn
        
        if errors or warnings:
                return True
@@ -355,12 +380,203 @@
  #------#

  def do_test(args):
+
+       try:
+               opts, args = getopt.getopt(args, ACTIONS['test']['options'])
+       except getopt.error,e:
+               print "args: %s" % args
+               print >> sys.stderr, "Wrong option: %s" % e.opt
+               sys.exit(255)
+       
+       do_update = False
+       do_generate = False
+       do_add = False
+       do_delete = False
+       got_html = False
+       do_html = False
+       do_print = False
+       sample_dirs = None
+       test_str = None
+       tmpl_file = None
+       html_file = None
+       pic = None
+       outfile = None
+       for o,v in opts:
+               if o == '-u':
+                       do_update = True
+               elif o == '-a':
+                       do_add = True
+                       test_str = v
+               elif o == '-d':
+                       do_delete = True
+                       test_str = v
+               elif o == '-s':
+                       sample_dirs = v.split(":")
+               elif o == '-f':
+                       outfile = v
+               elif o == '-g':
+                       do_html = True
+                       tmpl_file = v
+               elif o == '-o':
+                       got_html = True
+                       html_file = v
+               elif o == '-p':
+                       do_print = True
+                       pic = v
+               else:
+                       print >> sys.stderr, "Wrong option %s" % o
+       if not outfile:
+               try:
+                       outfile = os.environ['JALLIB_MATRIX']
+               except KeyError:
+                       print >> sys.stderr,"Please provide a file to get/store 
the testing  
matrix (-f option or JALLIB_MATRIX env. var)"
+                       sys.exit(255)
+       if not sample_dirs:
+               v = os.environ.get('JALLIB_SAMPLEDIR',os.path.curdir)
+               sample_dirs = v.split(":")
+       if do_update:
+               update_testing_matrix(sample_dirs,outfile)
+       elif do_add:
+               add_update_test(test_str,outfile)
+       elif do_delete:
+               delete_test(test_str,outfile)
+       elif do_html and got_html:
+               generate_html(tmpl_file,html_file,outfile)
+       elif do_print:
+               display_test_results(pic,outfile)
+       else:
+               raise NotImplementedError("Specify -u, -g or -a option")
+
+def get_matrix(outfile):
        # localized import: if one doesn't want to deal
        # with test, don't force him to install yaml lib
        import yaml
-       print "do_test, args: %s" % repr(args)
+       
+       # existing file or from scratch ?
+       if os.path.isfile(outfile):
+               matrix = yaml.load(file(outfile).read())
+       else:
+               matrix = {}
+       return matrix
+
+def save_matrix(matrix,outfile):
+       import yaml
+       fout = file(outfile,"w")
+       print >> fout, yaml.dump(matrix)
+       fout.close()
+       
+def update_testing_matrix(sample_dirs,outfile):
+
+       matrix = get_matrix(outfile)
+
+       def analyze_samples(device,fullpathdir):
+               content = os.listdir(fullpathdir)
+               for jalfile in content:
+                       if jalfile.startswith(".") or not 
jalfile.endswith(".jal"):
+                               continue
+                       ###print "jalfile: %s (%s)" % 
(jalfile,jalfile.startswith("."))
+                       matrix[device]['samples'].setdefault(jalfile,{'pass' : 
None})
+       
+       def analyse_sampledir(dir):
+               if not "by_device" in os.listdir(dir):
+                       print >> sys.stderr, "Sample dir '%s' does not contain 
'by_device'  
map." % dir
+                       sys.exit(1)
+               for devicedir in os.listdir(os.path.join(dir,'by_device')):
+                       fullpath = os.path.join(dir,'by_device',devicedir)
+                       if not os.path.isdir(fullpath) or 
devicedir.startswith("."):
+                               continue
+                       matrix.setdefault(devicedir,{'samples' : {}, 'tests' : 
{}})
+                       
analyze_samples(devicedir,os.path.join(dir,'by_device',devicedir))
+
+       def analyse_testdir(dir):
+               if not "test" in os.listdir(dir):
+                       print >> sys.stderr, "Sample dir '%s' does not contain 
'test' map." %  
dir
+                       sys.exit(1)
+               fulldir = os.path.join(dir,"test")
+               tdirs = [os.path.join(fulldir,d) for d in os.listdir(fulldir) 
if not  
d.startswith(".") and d != "board"]
+               test_files = []
+               for tdir in tdirs:
+                       test_files.extend([f for f in get_jal_filenames(tdir) 
if  
f.startswith("test_")])
+               # dispatch to devices
+               for d in matrix.keys():
+                       for t in test_files:
+                               matrix[d]['tests'].setdefault(t,{'pass' : None, 
'board' : None})
+
+       
+       for sdir in sample_dirs:
+               analyse_sampledir(sdir)
+               # Deactivate, until we can selecttively know which
+               # is available for which PIC
+               ##analyse_testdir(sdir)
+       
+       save_matrix(matrix,outfile)
+
+
+def add_update_test(test_str,outfile):
+       matrix = get_matrix(outfile)
+       # TODO: check samples actually exist
+       try:
+               pic,testfile,result = test_str.split(":")
+       except ValueError:
+               print >> sys.stderr,"Please specify the result as  
<pic>:<test_file>:<result> (eg. 16f88:serial_hw_echo.jal:true)"
+               sys.exit(1)
+       # normalize
+       try:
+               result = {'true':True,'false':False,'null':None}[result]
+       except KeyError,e:
+               print >> sys.stderr,"Invalid result '%s'. Specify either true, 
false or  
null" % e
+               sys.exit(1)
+       try:
+               samples = matrix[pic]['samples']
+               n = {'pass' : result}
+               if samples.has_key(testfile):
+                       t = samples[testfile]
+                       print "Update test '%s' for PIC %s: %s => %s" %  
(testfile,pic,repr(t),repr(n))
+                       samples[testfile] = n
+               else:
+                       print "Add new test '%s' for PIC %s: %s" % 
(testfile,pic,n)
+               samples[testfile] = n
+               save_matrix(matrix,outfile)
+       except KeyError,e:
+               print >> sys.stderr,"Can't find PIC %s (need to update the 
matrix ?)" % e
+
+def delete_test(test_str,outfile):
+       matrix = get_matrix(outfile)
+       # TODO: check samples actually exist
+       try:
+               pic,testfile = test_str.split(":")
+       except ValueError:
+               print >> sys.stderr,"Please specify the test to remove as  
<pic>:<test_file> (eg. 16f88:bad_test.jal)"
+               sys.exit(1)
+       try:
+               print "Unregistering test '%s' from PIC %s" % (testfile,pic)
+               del matrix[pic]['samples'][testfile]
+               save_matrix(matrix,outfile)
+       except KeyError,e:
+               print >> sys.stderr, "Unable to delete '%s' from PIC %s, cannot 
 
find '%s'" % (testfile,pic,e)
+               sys.exit(1)
+
+def generate_html(tmpl_file,html_file,outfile):
+       import Cheetah.Template
+       matrix = get_matrix(outfile)
+       tmplsrc = "".join(file(tmpl_file,"r").readlines())
+       klass = Cheetah.Template.Template.compile(tmplsrc)
+       tmpl = klass()
+       tmpl.test_results = matrix
+       fout = file(html_file,"w")
+       print >> fout, tmpl.main()

+def display_test_results(pic,outfile):
+       matrix = get_matrix(outfile)
+       try:
+               print "samples:"
+               for k,v in matrix[pic]['samples'].items():
+                       print "    %s : %s" % (k,v['pass'])
+       except KeyError,e:
+               print >> sys.stderr, "Cant't test result for PIC %s" % e
+               sys.exit(1)

+       
  #############
  # HELP FUNC #
  #############
@@ -376,6 +592,7 @@

  """

+
  def compile_help():
        print """
      jallib compile file.jal
@@ -400,8 +617,11 @@
                                    path (cwd) as the root path.
                                    Precedence: cwd < var < option

-    -E path    : use this option to manually set the path to jalv2  
executable. If not set, except
-                 it to be on path.
+    -E path    : use this option to manually set the path to jalv2  
executable. If not set,
+                 will search for a JALLIB_JALV2 environment variable, or  
default to 'jalv2'
+                                and expect it to be on path.
+
+(for convenience, jallib script's options are uppercased, whereas jalv2's  
are lowercased)

  """

@@ -418,19 +638,43 @@

  def test_help():
        print """
-    jallib test -U -F testing_matrix.yaml [-S path/to/sample]
+    jallib test -u -f testing_matrix.yaml [-s path/to/sample] [-g  
template.tmpl -o page.html] [-p picname]

-Use this option to handle test.
+Use this option to handle the testing matrix and the test result page.

-    -U: update an existing testing matrix, by searching for new samples  
and tests.
-        This won't erase previous testing results, but will potentially  
add new test line
+    -u: update an existing testing matrix, by searching for new samples.  
Tests must be
+        manually added to the testing matrix file (because tests are not  
relevant to all target chips).
+        This won't erase previous testing results, but will potentially  
add new sample lines
          to the testing matrix file.

-    -F: file storing the testing matrix results. YAML formatted
-
-    -S: path to the sample directory. If no option is given, it will  
expect to define
-        as an environment variable, JALLIB_SAMPLEDIR
+    -a: add or update a test result. If the test does not exist, it's  
added to the matrix, else
+        results will be updated.
+        The format is target:test_file:result. For example:
+         * to register a new test which passed, for 16f88
+            -a 16f88:new_test.jal:true
+         * to register a new test which failed, for 16f877
+            -a 16f877:new_test.jal:false
+         * to register a new test, not run yet, for 16f648a
+            -a 16f648a:new_test.jal:null
+
+    -p: print current test result for a given PIC
+
+    -d: delete/unregister test. The format is: target:test_file. Ex:
+        To remove a test from 16f88 device:
+            -d 16f88:bad_test.jal

+    -g: generate HTML a testing matrix from tests results, and dedicated  
test result pages
+        for each PIC, from both samples and tests. Needs -W option.
+
+    -o: specify output HTML file. Used with -g option.
+
+    -f: file storing the testing matrix results. YAML formatted. If not  
specified, will look for a
+        JALLIB_MATRIX environment variable.
+
+    -s: path to the sample directory (or multiple sample directory, ':'  
separated). If no option is given,
+        it will expect to define as an environment variable,  
JALLIB_SAMPLEDIR. If no option is given, and
+        no env. variable can be found, the current directory will be  
considered.
+        The sample(s) directory(ies) *must* contain a 'by_device'  
directory.

  """

@@ -448,7 +692,7 @@
  ACTIONS = {
                'compile'       : {'callback' : do_compile, 'options' : 'R:E:', 
'help' :  
compile_help},
                'validate'      : {'callback' : do_validate, 'options' : '', 
'help' :  
validate_help},
-               'test'          : {'callback' : do_test, 'options' : 'S:GU', 
'help' : test_help},
+               'test'          : {'callback' : do_test, 'options' : 
's:uf:a:g:d:o:p:', 'help' :  
test_help},
                'help'          : {'callback' : do_help, 'options' : '', 'help' 
: None},
                }

@@ -460,7 +704,6 @@
                action_args = sys.argv[2:]
                try:
                        callme = ACTIONS[action]['callback']
-                       callme(action_args)
                except KeyError,e:
                        if action in ('help','--help','-h'):
                                do_help(action_args)
@@ -468,6 +711,7 @@
                        else:
                                print "Unknown action %s" % e
                                sys.exit(255)
+               callme(action_args)
        except IndexError,e:
-               print >> sys.stderr,"Please provide an action: %s" % 
repr(ACTIONS.keys())
+               print >> sys.stderr, "Please provide an action: %s" %  
repr(ACTIONS.keys())
                sys.exit(255)

Added: trunk/tools/testing_matrix.tmpl
==============================================================================
--- (empty file)
+++ trunk/tools/testing_matrix.tmpl     Sat Oct 18 01:29:20 2008
@@ -0,0 +1,65 @@
+#def main
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html>
+    <head>
+    </head>
+    <body>
+               $content
+       </body>
+</html>
+#end def
+
+
+#def meter_eval(data):
+   #set samples = data['samples']
+   #set tests = data['tests']
+
+   #set slen = len(samples)
+   #set tlen = len(tests)
+   #set sgood = len([s for s in samples if samples[s]['pass']])
+   #set tgood = len([s for s in tests if tests[s]['pass']])
+   #set sscore = slen and float(sgood) / float(slen) or 0.0
+   #set tscore = tlen and float(tgood) / float(tlen) or 0.0
+   #set gscore = (10 * tscore + 90 * sscore) / 100.0
+   #return sscore,tscore,gscore
+
+#end def
+
+#def content
+   #set chips = sorted([k for k in $test_results.keys()])
+   #set tests = sorted(list(set([s for k in $test_results.keys() for s in  
$test_results[k]['tests']])))
+   <table border=1>
+   <tr>
+         <th>Target chip</th>
+         <th>Testing meter</th>
+         #for t in tests
+                <th>$t</th>
+         #end for
+   </tr>
+   #for chip,data in sorted($test_results.items(),cmp=lambda a,b:  
cmp($meter_eval($a[1])[-1],$meter_eval($b[1])[-1]),reverse=True)
+   <tr>
+         #set s,t,g = $meter_eval($data)
+         #silent s,t,g = map(lambda x: x * 100,(s,t,g))
+         <td><a href="test_${chip}.html">$chip</a></td>
+         <td>
+                ###<img  
src="http://chart.apis.google.com/chart?cht=bhs&amp;chs=200x75&amp;chd=t:$s,$t,$g%7C100,100,100&amp;chco=C22E30,F99393&amp;chbh=10&amp;chxt=x,y&amp;chxl=1:%7Cglobal%7Ctests%7Csamples"/>
+                <img  
src="http://chart.apis.google.com/chart?cht=bhs&amp;chs=200x35&amp;chd=t:$s%7C100&amp;chco=C22E30,F99393&amp;chbh=10&amp;chxt=x,y&amp;chxl=1:%7Cglobal"/>
+         </td>
+         #for t in tests
+                #try
+                       #set res = $test_results[chip]['tests'][t]['pass']
+                       #if res == True
+                       <td style="background-color: green;">$res</td>
+                       #elif res == False
+                       <td style="background-color: red;">$res</td>
+                       #else
+                       <td>$res</td>
+                       #end if
+                #except KeyError:
+                       <td>?</td>
+                #end try
+         #end for
+   </tr>
+   #end for
+   </table>
+#end def

Added: trunk/unvalidated/sample/testing_matrix.yaml
==============================================================================
--- (empty file)
+++ trunk/unvalidated/sample/testing_matrix.yaml        Sat Oct 18 01:29:20 2008
@@ -0,0 +1,1192 @@
+10f200:
+  samples:
+    b10f200.jal: {pass: null}
+  tests: {}
+10f202:
+  samples:
+    b10f202.jal: {pass: null}
+  tests: {}
+10f204:
+  samples:
+    b10f204.jal: {pass: null}
+  tests: {}
+10f206:
+  samples:
+    b10f206.jal: {pass: null}
+  tests: {}
+10f220:
+  samples:
+    b10f220.jal: {pass: null}
+  tests: {}
+10f222:
+  samples:
+    b10f222.jal: {pass: null}
+  tests: {}
+12f508:
+  samples:
+    b12f508.jal: {pass: null}
+  tests: {}
+12f509:
+  samples:
+    b12f509.jal: {pass: null}
+  tests: {}
+12f510:
+  samples:
+    b12f510.jal: {pass: null}
+  tests: {}
+12f519:
+  samples:
+    b12f519.jal: {pass: null}
+  tests: {}
+12f609:
+  samples:
+    b12f609.jal: {pass: null}
+  tests: {}
+12f615:
+  samples:
+    b12f615.jal: {pass: null}
+  tests: {}
+12f629:
+  samples:
+    b12f629.jal: {pass: null}
+  tests: {}
+12f635:
+  samples:
+    b12f635.jal: {pass: null}
+  tests: {}
+12f675:
+  samples:
+    b12f675.jal: {pass: null}
+  tests: {}
+12f683:
+  samples:
+    b12f683.jal: {pass: null}
+  tests: {}
+12hv609:
+  samples:
+    b12hv609.jal: {pass: null}
+  tests: {}
+12hv615:
+  samples:
+    b12hv615.jal: {pass: null}
+  tests: {}
+16f505:
+  samples:
+    b16f505.jal: {pass: null}
+  tests: {}
+16f506:
+  samples:
+    b16f506.jal: {pass: null}
+  tests: {}
+16f526:
+  samples:
+    b16f526.jal: {pass: null}
+  tests: {}
+16f54:
+  samples:
+    b16f54.jal: {pass: null}
+  tests: {}
+16f57:
+  samples:
+    b16f57.jal: {pass: null}
+  tests: {}
+16f610:
+  samples:
+    b16f610.jal: {pass: null}
+  tests: {}
+16f616:
+  samples:
+    b16f616.jal: {pass: null}
+  tests: {}
+16f627:
+  samples:
+    b16f627.jal: {pass: null}
+  tests: {}
+16f627a:
+  samples:
+    b16f627a.jal: {pass: null}
+  tests: {}
+16f628:
+  samples:
+    b16f628.jal: {pass: null}
+  tests: {}
+16f628a:
+  samples:
+    b16f628a.jal: {pass: null}
+  tests: {}
+16f630:
+  samples:
+    b16f630.jal: {pass: null}
+  tests: {}
+16f631:
+  samples:
+    b16f631.jal: {pass: null}
+  tests: {}
+16f636:
+  samples:
+    b16f636.jal: {pass: null}
+  tests: {}
+16f639:
+  samples:
+    b16f639.jal: {pass: null}
+  tests: {}
+16f648a:
+  samples:
+    b16f648a.jal: {pass: null}
+  tests: {}
+16f676:
+  samples:
+    b16f676.jal: {pass: null}
+  tests: {}
+16f677:
+  samples:
+    b16f677.jal: {pass: null}
+  tests: {}
+16f684:
+  samples:
+    b16f684.jal: {pass: null}
+  tests: {}
+16f685:
+  samples:
+    b16f685.jal: {pass: null}
+  tests: {}
+16f687:
+  samples:
+    b16f687.jal: {pass: null}
+  tests: {}
+16f688:
+  samples:
+    b16f688.jal: {pass: null}
+  tests: {}
+16f689:
+  samples:
+    b16f689.jal: {pass: null}
+  tests: {}
+16f690:
+  samples:
+    b16f690.jal: {pass: null}
+  tests: {}
+16f716:
+  samples:
+    b16f716.jal: {pass: null}
+  tests: {}
+16f72:
+  samples:
+    b16f72.jal: {pass: null}
+  tests: {}
+16f722:
+  samples:
+    b16f722.jal: {pass: null}
+  tests: {}
+16f723:
+  samples:
+    b16f723.jal: {pass: null}
+  tests: {}
+16f724:
+  samples:
+    b16f724.jal: {pass: null}
+  tests: {}
+16f726:
+  samples:
+    b16f726.jal: {pass: null}
+  tests: {}
+16f727:
+  samples:
+    b16f727.jal: {pass: null}
+  tests: {}
+16f73:
+  samples:
+    b16f73.jal: {pass: null}
+  tests: {}
+16f737:
+  samples:
+    b16f737.jal: {pass: null}
+  tests: {}
+16f74:
+  samples:
+    b16f74.jal: {pass: null}
+  tests: {}
+16f747:
+  samples:
+    b16f747.jal: {pass: null}
+  tests: {}
+16f76:
+  samples:
+    b16f76.jal: {pass: null}
+  tests: {}
+16f767:
+  samples:
+    b16f767.jal: {pass: null}
+  tests: {}
+16f77:
+  samples:
+    b16f77.jal: {pass: null}
+  tests: {}
+16f777:
+  samples:
+    b16f777.jal: {pass: null}
+  tests: {}
+16f785:
+  samples:
+    b16f785.jal: {pass: null}
+  tests: {}
+16f818:
+  samples:
+    b16f818.jal: {pass: null}
+  tests: {}
+16f819:
+  samples:
+    b16f819.jal: {pass: null}
+  tests: {}
+16f83:
+  samples:
+    b16f83.jal: {pass: null}
+  tests: {}
+16f84:
+  samples:
+    b16f84.jal: {pass: null}
+  tests: {}
+16f84a:
+  samples:
+    b16f84a.jal: {pass: null}
+  tests: {}
+16f87:
+  samples:
+    b16f87.jal: {pass: null}
+  tests: {}
+16f870:
+  samples:
+    b16f870.jal: {pass: null}
+  tests: {}
+16f871:
+  samples:
+    b16f871.jal: {pass: null}
+  tests: {}
+16f872:
+  samples:
+    b16f872.jal: {pass: null}
+  tests: {}
+16f873:
+  samples:
+    b16f873.jal: {pass: null}
+  tests: {}
+16f873a:
+  samples:
+    b16f873a.jal: {pass: null}
+  tests: {}
+16f874:
+  samples:
+    b16f874.jal: {pass: null}
+  tests: {}
+16f874a:
+  samples:
+    b16f874a.jal: {pass: null}
+  tests: {}
+16f876:
+  samples:
+    b16f876.jal: {pass: null}
+  tests: {}
+16f876a:
+  samples:
+    b16f876a.jal: {pass: null}
+    test_tc77.jal: {pass: null}
+  tests: {}
+16f877:
+  samples:
+    b16f877.jal: {pass: null}
+    lcd_hd44780_tmp_4_line.jal: {pass: null}
+    lcd_hd44780_tmp_8_line.jal: {pass: null}
+    lcd_st7036.jal: {pass: null}
+    rtc_ds1302.jal: {pass: null}
+  tests: {}
+16f877a:
+  samples:
+    b16f877a.jal: {pass: null}
+    hello_world_lcd.jal: {pass: null}
+    keyboard_lcd.jal: {pass: null}
+    lcd_format.jal: {pass: null}
+    print_serial_numbers.jal: {pass: null}
+    pwm_led.jal: {pass: null}
+    read_co2_t6603.jal: {pass: null}
+    test_display_hd44780_4_line.jal: {pass: null}
+    test_display_hd44780_8_line.jal: {pass: null}
+  tests: {}
+16f88:
+  samples:
+    adc_lowres.jal: {pass: true}
+    b16f88.jal: {pass: true}
+    delay_basic.jal: {pass: true}
+    print_serial_numbers.jal: {pass: true}
+    pwm_led.jal: {pass: true}
+    pwm_led_highres.jal: {pass: true}
+    pwm_sound.jal: {pass: true}
+    remember_me.jal: {pass: true}
+    serial_hw_echo.jal: {pass: true}
+    serial_hw_int_cts_echo.jal: {pass: true}
+    serial_sw_echo.jal: {pass: true}
+  tests: {}
+16f882:
+  samples:
+    b16f882.jal: {pass: null}
+  tests: {}
+16f883:
+  samples:
+    b16f883.jal: {pass: null}
+  tests: {}
+16f884:
+  samples:
+    b16f884.jal: {pass: null}
+  tests: {}
+16f886:
+  samples:
+    b16f886.jal: {pass: null}
+  tests: {}
+16f887:
+  samples:
+    b16f887.jal: {pass: null}
+  tests: {}
+16f913:
+  samples:
+    b16f913.jal: {pass: null}
+  tests: {}
+16f914:
+  samples:
+    b16f914.jal: {pass: null}
+  tests: {}
+16f916:
+  samples:
+    b16f916.jal: {pass: null}
+  tests: {}
+16f917:
+  samples:
+    b16f917.jal: {pass: null}
+  tests: {}
+16f946:
+  samples:
+    b16f946.jal: {pass: null}
+  tests: {}
+16hv540:
+  samples:
+    b16hv540.jal: {pass: null}
+  tests: {}
+16hv610:
+  samples:
+    b16hv610.jal: {pass: null}
+  tests: {}
+16hv616:
+  samples:
+    b16hv616.jal: {pass: null}
+  tests: {}
+16hv785:
+  samples:
+    b16hv785.jal: {pass: null}
+  tests: {}
+16lf722:
+  samples:
+    b16lf722.jal: {pass: null}
+  tests: {}
+16lf723:
+  samples:
+    b16lf723.jal: {pass: null}
+  tests: {}
+16lf724:
+  samples:
+    b16lf724.jal: {pass: null}
+  tests: {}
+16lf726:
+  samples:
+    b16lf726.jal: {pass: null}
+  tests: {}
+16lf727:
+  samples:
+    b16lf727.jal: {pass: null}
+  tests: {}
+18f1220:
+  samples:
+    b18f1220.jal: {pass: null}
+  tests: {}
+18f1230:
+  samples:
+    b18f1230.jal: {pass: null}
+  tests: {}
+18f1320:
+  samples:
+    b18f1320.jal: {pass: null}
+  tests: {}
+18f1330:
+  samples:
+    b18f1330.jal: {pass: null}
+  tests: {}
+18f13k22:
+  samples:
+    b18f13k22.jal: {pass: null}
+  tests: {}
+18f13k50:
+  samples:
+    b18f13k50.jal: {pass: null}
+  tests: {}
+18f14k22:
+  samples:
+    b18f14k22.jal: {pass: null}
+  tests: {}
+18f14k50:
+  samples:
+    b18f14k50.jal: {pass: null}
+  tests: {}
+18f2220:
+  samples:
+    b18f2220.jal: {pass: null}
+  tests: {}
+18f2221:
+  samples:
+    b18f2221.jal: {pass: null}
+  tests: {}
+18f2320:
+  samples:
+    b18f2320.jal: {pass: null}
+  tests: {}
+18f2321:
+  samples:
+    b18f2321.jal: {pass: null}
+  tests: {}
+18f2331:
+  samples:
+    b18f2331.jal: {pass: null}
+  tests: {}
+18f2410:
+  samples:
+    b18f2410.jal: {pass: null}
+  tests: {}
+18f242:
+  samples:
+    b18f242.jal: {pass: null}
+  tests: {}
+18f2420:
+  samples:
+    b18f2420.jal: {pass: null}
+  tests: {}
+18f2423:
+  samples:
+    b18f2423.jal: {pass: null}
+  tests: {}
+18f2431:
+  samples:
+    b18f2431.jal: {pass: null}
+  tests: {}
+18f2439:
+  samples:
+    b18f2439.jal: {pass: null}
+  tests: {}
+18f2450:
+  samples:
+    b18f2450.jal: {pass: null}
+  tests: {}
+18f2455:
+  samples:
+    b18f2455.jal: {pass: null}
+  tests: {}
+18f2458:
+  samples:
+    b18f2458.jal: {pass: null}
+  tests: {}
+18f248:
+  samples:
+    b18f248.jal: {pass: null}
+  tests: {}
+18f2480:
+  samples:
+    b18f2480.jal: {pass: null}
+  tests: {}
+18f24j10:
+  samples:
+    b18f24j10.jal: {pass: null}
+  tests: {}
+18f24j11:
+  samples:
+    b18f24j11.jal: {pass: null}
+  tests: {}
+18f24j50:
+  samples:
+    b18f24j50.jal: {pass: null}
+  tests: {}
+18f24k20:
+  samples:
+    b18f24k20.jal: {pass: null}
+  tests: {}
+18f2510:
+  samples:
+    b18f2510.jal: {pass: null}
+  tests: {}
+18f2515:
+  samples:
+    b18f2515.jal: {pass: null}
+  tests: {}
+18f252:
+  samples:
+    b18f252.jal: {pass: null}
+  tests: {}
+18f2520:
+  samples:
+    b18f2520.jal: {pass: null}
+  tests: {}
+18f2523:
+  samples:
+    b18f2523.jal: {pass: null}
+  tests: {}
+18f2525:
+  samples:
+    b18f2525.jal: {pass: null}
+  tests: {}
+18f2539:
+  samples:
+    b18f2539.jal: {pass: null}
+  tests: {}
+18f2550:
+  samples:
+    b18f2550.jal: {pass: null}
+  tests: {}
+18f2553:
+  samples:
+    b18f2553.jal: {pass: null}
+  tests: {}
+18f258:
+  samples:
+    b18f258.jal: {pass: null}
+  tests: {}
+18f2580:
+  samples:
+    b18f2580.jal: {pass: null}
+  tests: {}
+18f2585:
+  samples:
+    b18f2585.jal: {pass: null}
+  tests: {}
+18f25j10:
+  samples:
+    b18f25j10.jal: {pass: null}
+  tests: {}
+18f25j11:
+  samples:
+    b18f25j11.jal: {pass: null}
+  tests: {}
+18f25j50:
+  samples:
+    b18f25j50.jal: {pass: null}
+  tests: {}
+18f25k20:
+  samples:
+    b18f25k20.jal: {pass: null}
+  tests: {}
+18f2610:
+  samples:
+    b18f2610.jal: {pass: null}
+  tests: {}
+18f2620:
+  samples:
+    b18f2620.jal: {pass: null}
+  tests: {}
+18f2680:
+  samples:
+    b18f2680.jal: {pass: null}
+  tests: {}
+18f2682:
+  samples:
+    b18f2682.jal: {pass: null}
+  tests: {}
+18f2685:
+  samples:
+    b18f2685.jal: {pass: null}
+  tests: {}
+18f26j11:
+  samples:
+    b18f26j11.jal: {pass: null}
+  tests: {}
+18f26j50:
+  samples:
+    b18f26j50.jal: {pass: null}
+  tests: {}
+18f26k20:
+  samples:
+    b18f26k20.jal: {pass: null}
+  tests: {}
+18f4220:
+  samples:
+    b18f4220.jal: {pass: null}
+  tests: {}
+18f4221:
+  samples:
+    b18f4221.jal: {pass: null}
+  tests: {}
+18f4320:
+  samples:
+    b18f4320.jal: {pass: null}
+  tests: {}
+18f4321:
+  samples:
+    b18f4321.jal: {pass: null}
+  tests: {}
+18f4331:
+  samples:
+    b18f4331.jal: {pass: null}
+  tests: {}
+18f4410:
+  samples:
+    b18f4410.jal: {pass: null}
+  tests: {}
+18f442:
+  samples:
+    b18f442.jal: {pass: null}
+  tests: {}
+18f4420:
+  samples:
+    b18f4420.jal: {pass: null}
+  tests: {}
+18f4423:
+  samples:
+    b18f4423.jal: {pass: null}
+  tests: {}
+18f4431:
+  samples:
+    b18f4431.jal: {pass: null}
+  tests: {}
+18f4439:
+  samples:
+    b18f4439.jal: {pass: null}
+  tests: {}
+18f4450:
+  samples:
+    b18f4450.jal: {pass: null}
+  tests: {}
+18f4455:
+  samples:
+    b18f4455.jal: {pass: null}
+  tests: {}
+18f4458:
+  samples:
+    b18f4458.jal: {pass: null}
+  tests: {}
+18f448:
+  samples:
+    b18f448.jal: {pass: null}
+  tests: {}
+18f4480:
+  samples:
+    b18f4480.jal: {pass: null}
+  tests: {}
+18f44j10:
+  samples:
+    b18f44j10.jal: {pass: null}
+  tests: {}
+18f44j11:
+  samples:
+    b18f44j11.jal: {pass: null}
+  tests: {}
+18f44j50:
+  samples:
+    b18f44j50.jal: {pass: null}
+  tests: {}
+18f44k20:
+  samples:
+    b18f44k20.jal: {pass: null}
+  tests: {}
+18f4510:
+  samples:
+    b18f4510.jal: {pass: null}
+  tests: {}
+18f4515:
+  samples:
+    b18f4515.jal: {pass: null}
+  tests: {}
+18f452:
+  samples:
+    b18f452.jal: {pass: null}
+  tests: {}
+18f4520:
+  samples:
+    b18f4520.jal: {pass: null}
+  tests: {}
+18f4523:
+  samples:
+    b18f4523.jal: {pass: null}
+  tests: {}
+18f4525:
+  samples:
+    b18f4525.jal: {pass: null}
+  tests: {}
+18f4539:
+  samples:
+    b18f4539.jal: {pass: null}
+  tests: {}
+18f4550:
+  samples:
+    b18f4550.jal: {pass: null}
+  tests: {}
+18f4553:
+  samples:
+    b18f4553.jal: {pass: null}
+  tests: {}
+18f458:
+  samples:
+    b18f458.jal: {pass: null}
+  tests: {}
+18f4580:
+  samples:
+    b18f4580.jal: {pass: null}
+  tests: {}
+18f4585:
+  samples:
+    b18f4585.jal: {pass: null}
+  tests: {}
+18f45j10:
+  samples:
+    b18f45j10.jal: {pass: null}
+  tests: {}
+18f45j11:
+  samples:
+    b18f45j11.jal: {pass: null}
+  tests: {}
+18f45j50:
+  samples:
+    b18f45j50.jal: {pass: null}
+  tests: {}
+18f45k20:
+  samples:
+    b18f45k20.jal: {pass: null}
+  tests: {}
+18f4610:
+  samples:
+    b18f4610.jal: {pass: null}
+  tests: {}
+18f4620:
+  samples:
+    b18f4620.jal: {pass: null}
+  tests: {}
+18f4680:
+  samples:
+    b18f4680.jal: {pass: null}
+  tests: {}
+18f4682:
+  samples:
+    b18f4682.jal: {pass: null}
+  tests: {}
+18f4685:
+  samples:
+    b18f4685.jal: {pass: null}
+  tests: {}
+18f46j11:
+  samples:
+    b18f46j11.jal: {pass: null}
+  tests: {}
+18f46j50:
+  samples:
+    b18f46j50.jal: {pass: null}
+  tests: {}
+18f46k20:
+  samples:
+    b18f46k20.jal: {pass: null}
+  tests: {}
+18f6310:
+  samples:
+    b18f6310.jal: {pass: null}
+  tests: {}
+18f6390:
+  samples:
+    b18f6390.jal: {pass: null}
+  tests: {}
+18f6393:
+  samples:
+    b18f6393.jal: {pass: null}
+  tests: {}
+18f63j11:
+  samples:
+    b18f63j11.jal: {pass: null}
+  tests: {}
+18f63j90:
+  samples:
+    b18f63j90.jal: {pass: null}
+  tests: {}
+18f6410:
+  samples:
+    b18f6410.jal: {pass: null}
+  tests: {}
+18f6490:
+  samples:
+    b18f6490.jal: {pass: null}
+  tests: {}
+18f6493:
+  samples:
+    b18f6493.jal: {pass: null}
+  tests: {}
+18f64j11:
+  samples:
+    b18f64j11.jal: {pass: null}
+  tests: {}
+18f64j90:
+  samples:
+    b18f64j90.jal: {pass: null}
+  tests: {}
+18f6520:
+  samples:
+    b18f6520.jal: {pass: null}
+  tests: {}
+18f6525:
+  samples:
+    b18f6525.jal: {pass: null}
+  tests: {}
+18f6527:
+  samples:
+    b18f6527.jal: {pass: null}
+  tests: {}
+18f6585:
+  samples:
+    b18f6585.jal: {pass: null}
+  tests: {}
+18f65j10:
+  samples:
+    b18f65j10.jal: {pass: null}
+  tests: {}
+18f65j11:
+  samples:
+    b18f65j11.jal: {pass: null}
+  tests: {}
+18f65j15:
+  samples:
+    b18f65j15.jal: {pass: null}
+  tests: {}
+18f65j50:
+  samples:
+    b18f65j50.jal: {pass: null}
+  tests: {}
+18f65j90:
+  samples:
+    b18f65j90.jal: {pass: null}
+  tests: {}
+18f6620:
+  samples:
+    b18f6620.jal: {pass: null}
+  tests: {}
+18f6621:
+  samples:
+    b18f6621.jal: {pass: null}
+  tests: {}
+18f6622:
+  samples:
+    b18f6622.jal: {pass: null}
+  tests: {}
+18f6627:
+  samples:
+    b18f6627.jal: {pass: null}
+  tests: {}
+18f6628:
+  samples:
+    b18f6628.jal: {pass: null}
+  tests: {}
+18f6680:
+  samples:
+    b18f6680.jal: {pass: null}
+  tests: {}
+18f66j10:
+  samples:
+    b18f66j10.jal: {pass: null}
+  tests: {}
+18f66j11:
+  samples:
+    b18f66j11.jal: {pass: null}
+  tests: {}
+18f66j15:
+  samples:
+    b18f66j15.jal: {pass: null}
+  tests: {}
+18f66j16:
+  samples:
+    b18f66j16.jal: {pass: null}
+  tests: {}
+18f66j50:
+  samples:
+    b18f66j50.jal: {pass: null}
+  tests: {}
+18f66j55:
+  samples:
+    b18f66j55.jal: {pass: null}
+  tests: {}
+18f66j60:
+  samples:
+    b18f66j60.jal: {pass: null}
+  tests: {}
+18f66j65:
+  samples:
+    b18f66j65.jal: {pass: null}
+  tests: {}
+18f6720:
+  samples:
+    b18f6720.jal: {pass: null}
+  tests: {}
+18f6722:
+  samples:
+    b18f6722.jal: {pass: null}
+  tests: {}
+18f6723:
+  samples:
+    b18f6723.jal: {pass: null}
+  tests: {}
+18f67j10:
+  samples:
+    b18f67j10.jal: {pass: null}
+  tests: {}
+18f67j11:
+  samples:
+    b18f67j11.jal: {pass: null}
+  tests: {}
+18f67j50:
+  samples:
+    b18f67j50.jal: {pass: null}
+  tests: {}
+18f67j60:
+  samples:
+    b18f67j60.jal: {pass: null}
+  tests: {}
+18f8310:
+  samples:
+    b18f8310.jal: {pass: null}
+  tests: {}
+18f8390:
+  samples:
+    b18f8390.jal: {pass: null}
+  tests: {}
+18f8393:
+  samples:
+    b18f8393.jal: {pass: null}
+  tests: {}
+18f83j11:
+  samples:
+    b18f83j11.jal: {pass: null}
+  tests: {}
+18f83j90:
+  samples:
+    b18f83j90.jal: {pass: null}
+  tests: {}
+18f8410:
+  samples:
+    b18f8410.jal: {pass: null}
+  tests: {}
+18f8490:
+  samples:
+    b18f8490.jal: {pass: null}
+  tests: {}
+18f8493:
+  samples:
+    b18f8493.jal: {pass: null}
+  tests: {}
+18f84j11:
+  samples:
+    b18f84j11.jal: {pass: null}
+  tests: {}
+18f84j90:
+  samples:
+    b18f84j90.jal: {pass: null}
+  tests: {}
+18f8520:
+  samples:
+    b18f8520.jal: {pass: null}
+  tests: {}
+18f8525:
+  samples:
+    b18f8525.jal: {pass: null}
+  tests: {}
+18f8527:
+  samples:
+    b18f8527.jal: {pass: null}
+  tests: {}
+18f8585:
+  samples:
+    b18f8585.jal: {pass: null}
+  tests: {}
+18f85j10:
+  samples:
+    b18f85j10.jal: {pass: null}
+  tests: {}
+18f85j11:
+  samples:
+    b18f85j11.jal: {pass: null}
+  tests: {}
+18f85j15:
+  samples:
+    b18f85j15.jal: {pass: null}
+  tests: {}
+18f85j50:
+  samples:
+    b18f85j50.jal: {pass: null}
+  tests: {}
+18f85j90:
+  samples:
+    b18f85j90.jal: {pass: null}
+  tests: {}
+18f8620:
+  samples:
+    b18f8620.jal: {pass: null}
+  tests: {}
+18f8621:
+  samples:
+    b18f8621.jal: {pass: null}
+  tests: {}
+18f8622:
+  samples:
+    b18f8622.jal: {pass: null}
+  tests: {}
+18f8627:
+  samples:
+    b18f8627.jal: {pass: null}
+  tests: {}
+18f8628:
+  samples:
+    b18f8628.jal: {pass: null}
+  tests: {}
+18f8680:
+  samples:
+    b18f8680.jal: {pass: null}
+  tests: {}
+18f86j10:
+  samples:
+    b18f86j10.jal: {pass: null}
+  tests: {}
+18f86j11:
+  samples:
+    b18f86j11.jal: {pass: null}
+  tests: {}
+18f86j15:
+  samples:
+    b18f86j15.jal: {pass: null}
+  tests: {}
+18f86j16:
+  samples:
+    b18f86j16.jal: {pass: null}
+  tests: {}
+18f86j50:
+  samples:
+    b18f86j50.jal: {pass: null}
+  tests: {}
+18f86j55:
+  samples:
+    b18f86j55.jal: {pass: null}
+  tests: {}
+18f86j60:
+  samples:
+    b18f86j60.jal: {pass: null}
+  tests: {}
+18f86j65:
+  samples:
+    b18f86j65.jal: {pass: null}
+  tests: {}
+18f8720:
+  samples:
+    b18f8720.jal: {pass: null}
+  tests: {}
+18f8722:
+  samples:
+    b18f8722.jal: {pass: null}
+  tests: {}
+18f8723:
+  samples:
+    b18f8723.jal: {pass: null}
+  tests: {}
+18f87j10:
+  samples:
+    b18f87j10.jal: {pass: null}
+  tests: {}
+18f87j11:
+  samples:
+    b18f87j11.jal: {pass: null}
+  tests: {}
+18f87j50:
+  samples:
+    b18f87j50.jal: {pass: null}
+  tests: {}
+18f87j60:
+  samples:
+    b18f87j60.jal: {pass: null}
+  tests: {}
+18f96j60:
+  samples:
+    b18f96j60.jal: {pass: null}
+  tests: {}
+18f96j65:
+  samples:
+    b18f96j65.jal: {pass: null}
+  tests: {}
+18f97j60:
+  samples:
+    b18f97j60.jal: {pass: null}
+  tests: {}
+18lf13k50:
+  samples:
+    b18lf13k50.jal: {pass: null}
+  tests: {}
+18lf14k50:
+  samples:
+    b18lf14k50.jal: {pass: null}
+  tests: {}
+18lf24j10:
+  samples:
+    b18lf24j10.jal: {pass: null}
+  tests: {}
+18lf24j11:
+  samples:
+    b18lf24j11.jal: {pass: null}
+  tests: {}
+18lf24j50:
+  samples:
+    b18lf24j50.jal: {pass: null}
+  tests: {}
+18lf25j10:
+  samples:
+    b18lf25j10.jal: {pass: null}
+  tests: {}
+18lf25j11:
+  samples:
+    b18lf25j11.jal: {pass: null}
+  tests: {}
+18lf25j50:
+  samples:
+    b18lf25j50.jal: {pass: null}
+  tests: {}
+18lf26j11:
+  samples:
+    b18lf26j11.jal: {pass: null}
+  tests: {}
+18lf26j50:
+  samples:
+    b18lf26j50.jal: {pass: null}
+  tests: {}
+18lf44j10:
+  samples:
+    b18lf44j10.jal: {pass: null}
+  tests: {}
+18lf44j11:
+  samples:
+    b18lf44j11.jal: {pass: null}
+  tests: {}
+18lf44j50:
+  samples:
+    b18lf44j50.jal: {pass: null}
+  tests: {}
+18lf45j10:
+  samples:
+    b18lf45j10.jal: {pass: null}
+  tests: {}
+18lf45j11:
+  samples:
+    b18lf45j11.jal: {pass: null}
+  tests: {}
+18lf45j50:
+  samples:
+    b18lf45j50.jal: {pass: null}
+  tests: {}
+18lf46j11:
+  samples:
+    b18lf46j11.jal: {pass: null}
+  tests: {}
+18lf46j50:
+  samples:
+    b18lf46j50.jal: {pass: null}
+  tests: {}
+

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"jallib" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/jallib?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to