simulavr-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Simulavr-devel] [PATCH 10/13] The beginnings of an AVR XML file to AVR


From: Onno Kortmann
Subject: [Simulavr-devel] [PATCH 10/13] The beginnings of an AVR XML file to AVR device class converter
Date: Tue, 3 Mar 2009 23:46:25 +0100

If one applies this patch, one needs to call avr-fab.py from 
within the src/fab directory, with the Atmel .xml files in place.
For now, it will create only two, incomplete small AVR device classes,
for the tiny2313 and the tiny15l.

Signed-off-by: Onno Kortmann <address@hidden>
---
 src/Makefile.am         |    5 ++
 src/fab/avr-fab.py      |   83 +++++++++++++++++++++++++++++++++
 src/fab/avr_tmpl.cpp    |   80 ++++++++++++++++++++++++++++++++
 src/fab/avr_tmpl.h      |   50 ++++++++++++++++++++
 src/fab/avr_tmpl.v      |   50 ++++++++++++++++++++
 src/fab/converter.py    |   95 +++++++++++++++++++++++++++++++++++++
 src/fab/core.py         |  118 +++++++++++++++++++++++++++++++++++++++++++++++
 src/fab/eeprom_tmpl.cpp |   30 ++++++++++++
 src/fab/irq.py          |   50 ++++++++++++++++++++
 src/fab/pins.py         |   52 +++++++++++++++++++++
 src/fab/port.py         |   47 +++++++++++++++++++
 src/fab/port_tmpl.cpp   |   44 +++++++++++++++++
 src/fab/timer.py        |   29 ++++++++++++
 src/fab/timer_tmpl.cpp  |   48 +++++++++++++++++++
 src/hwdecls.h           |   20 ++++++++
 15 files changed, 801 insertions(+), 0 deletions(-)
 create mode 100755 src/fab/avr-fab.py
 create mode 100644 src/fab/avr_tmpl.cpp
 create mode 100644 src/fab/avr_tmpl.h
 create mode 100644 src/fab/avr_tmpl.v
 create mode 100644 src/fab/converter.py
 create mode 100644 src/fab/core.py
 create mode 100644 src/fab/eeprom_tmpl.cpp
 create mode 100644 src/fab/irq.py
 create mode 100644 src/fab/pins.py
 create mode 100644 src/fab/port.py
 create mode 100644 src/fab/port_tmpl.cpp
 create mode 100644 src/fab/timer.py
 create mode 100644 src/fab/timer_tmpl.cpp
 create mode 100644 src/hwdecls.h

diff --git a/src/Makefile.am b/src/Makefile.am
index 63a7c27..b3301cc 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -21,6 +21,8 @@ libavrsim_pp_la_SOURCES       =       \
        at4433.cpp              \
        at8515.cpp              \
        atmega128.cpp           \
+       avr_ATtiny15.cpp        \
+       avr_ATtiny2313.cpp      \
        avrdevice.cpp           \
        avrerror.cpp            \
        avrmalloc.cpp           \
@@ -69,6 +71,8 @@ pkginclude_HEADERS =  \
        at4433.h                \
        at8515.h                \
        atmega128.h             \
+       avr_ATtiny15.h          \
+       avr_ATtiny2313.h        \
        avrdevice.h             \
        avrdevice_impl.h        \
        avrerror.h              \
@@ -85,6 +89,7 @@ pkginclude_HEADERS =  \
        helper.h                \
        hwacomp.h               \
        hwad.h                  \
+       hwdecls.h               \
        hweeprom.h              \
        hwextirq.h              \
        hwmegaextirq.h          \
diff --git a/src/fab/avr-fab.py b/src/fab/avr-fab.py
new file mode 100755
index 0000000..283e089
--- /dev/null
+++ b/src/fab/avr-fab.py
@@ -0,0 +1,83 @@
+#!/usr/bin/python
+# Copyright (C) 2009 Onno Kortmann <address@hidden>
+#  
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#  
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#  
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#  
+from xml.dom.minidom import parse
+
+from Cheetah.Template import Template
+
+from core import Core
+from port import Ports
+from irq import IRQTable
+from timer import Timer
+from pins import Pins
+
+converters=[
+    Core(),
+    IRQTable(),
+    Ports(),
+    Timer(),
+    Pins()
+    ]
+
+
+from os import listdir
+
+# for fn in listdir("atmel-xml/"):
+#     if (fn.find(".xml")<0
+#         or fn.find("ATxmega")>=0
+#         or fn.find("AT89")>=0
+#         or fn.find("AT86")>=0
+#         or fn.find("ATtiny10")>=0
+#         or fn.find("ATtiny28")>=0 # <- has weird port logic. FIXME: support 
this!
+#         or fn.find("HV")>=0 # 'smart battery devices' also have some weird 
port logic.
+#         or fn.find("CAN")>=0 # CAN devices are not implemented either
+#         or fn.find("USB")>=0 # USB devices are weird in general.
+#         or fn.find("M1")>=0 or fn.find("C1")>=0 # automotive stuff
+#         ):
+#         continue
+    
+
+for fn in ["ATtiny15.xml",
+            "ATtiny2313.xml"
+           ]:
+    print "Parsing %s" % fn
+    p=parse("atmel-xml/%s" % fn)
+
+    CPPtmpl=Template(file="avr_tmpl.cpp")
+    Htmpl=Template(file="avr_tmpl.h")
+    Vtmpl=Template(file="avr_tmpl.v")
+    
+    for c in converters:
+        print "Extracting using %s." % c
+        c(p, CPPtmpl)
+        c(p, Htmpl)
+        c(p, Vtmpl)
+        
+    cpp_f=open("../avr_"+fn[:-4]+".cpp", "w")
+    h_f=open("../avr_"+fn[:-4]+".h", "w")
+    v_f=open("../verilog/avr_"+fn[:-4]+".v", "w")
+    
+    print "Writing files for %s" % fn[:-4]
+    print>>cpp_f, CPPtmpl
+    print>>h_f, Htmpl
+    print>>v_f, Vtmpl
+    
+    cpp_f.close()
+    h_f.close()
+    v_f.close()
+    
+    
diff --git a/src/fab/avr_tmpl.cpp b/src/fab/avr_tmpl.cpp
new file mode 100644
index 0000000..7aef630
--- /dev/null
+++ b/src/fab/avr_tmpl.cpp
@@ -0,0 +1,80 @@
+ /*
+ ****************************************************************************
+ *
+ * simulavr - A simulator for the Atmel AVR family of microcontrollers.
+ * Copyright (C) 2001, 2002, 2003   Klaus Rudolph              
+ * Copyright (C) 2008 Onno Kortmann
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ ****************************************************************************
+ *
+ * THIS FILE HAS BEEN AUTOMATICALLY GENERATED FROM avr_tmpl.cpp.
+ *                     --- DO NOT EDIT MANUALLY! ---
+ */
+\#include "avr_$(part).h"
+
+## FIXME: Include only those parts which are needed!
+\#include "irqsystem.h"
+\#include "avrfactory.h"
+\#include "hweeprom.h"
+\#include "hwstack.h"
+\#include "hwport.h"
+\#include "hwwado.h"
+\#include "hwtimer.h"
+\#include "hwtimer01irq.h"
+\#include "ioregs.h"
+
+AVR_REGISTER($(part), AVR_$(part));
+
+AVR_$part::~AVR_$(part)() {}
+
+AVR_$part::AVR_$(part)() : AvrDevice($io_size,
+                                  $iram_size,
+                                  $eram_size,
+                                  $flash_size) {
+    irqSystem = new HWIrqSystem(this, $irq_vec_size); 
+
+#include "eeprom_tmpl.cpp"
+    
+#if $iram_size>0
+    stack = new HWStack(this, Sram, $stack.ceil);
+#else
+    stack = new HWStack(this, new ThreeLevelStack(), 0x06);
+#endif
+
+    wado                       = new HWWado(this);
+    rw[$io["WDTCR"].addr]      = new RWWdtcr(this, wado);
+    
+    prescaler  = new HWPrescaler(this);
+    mcucr      = new HWMcucr(this); //FIXME! MCUCR reg!
+    rw[$io["SREG"].addr]       = new RWSreg(this, status);
+
+#if "SPL" in $io
+    rw[$io["SPL"].addr]= new RWSpl(this, stack);
+#endif
+#if "SPH" in $io
+    rw[$io["SPH"].addr]= new RWSph(this, stack);
+#endif    
+    
+
+    
+#include "port_tmpl.cpp"
+
+#include "timer_tmpl.cpp"
+    
+    Reset();
+}
+
+
diff --git a/src/fab/avr_tmpl.h b/src/fab/avr_tmpl.h
new file mode 100644
index 0000000..2c4b3bf
--- /dev/null
+++ b/src/fab/avr_tmpl.h
@@ -0,0 +1,50 @@
+ /*
+ ****************************************************************************
+ *
+ * simulavr - A simulator for the Atmel AVR family of microcontrollers.
+ * Copyright (C) 2001, 2002, 2003   Klaus Rudolph
+ * Copyright (C) 2008 Onno Kortmann
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ ****************************************************************************
+ *
+ * THIS FILE HAS BEEN AUTOMATICALLY GENERATED FROM avr_tmpl.h.
+ *                     --- DO NOT EDIT MANUALLY! ---
+ */
+\#ifndef AVR_PART_$(part)
+\#define AVR_PART_$(part)
+\#include "hwdecls.h"
+\#include "avrdevice.h"
+
+class AVR_$(part) : public AvrDevice {
+ public:
+    AVR_$(part)();
+    ~AVR_$(part)();
+ private:
+#for $Letter in $io_ports
+    HWPort *port$Letter.lower;
+#endfor
+
+    HWMcucr *mcucr;
+#if $has_prescaler    
+    HWPrescaler *prescaler;
+#endif
+
+#if $has_timer1
+    HWTimer01Irq *timer01irq;
+    HWTimer1 *timer1;
+#endif    
+};
+\#endif
diff --git a/src/fab/avr_tmpl.v b/src/fab/avr_tmpl.v
new file mode 100644
index 0000000..b4b3946
--- /dev/null
+++ b/src/fab/avr_tmpl.v
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2009 Onno Kortmann <address@hidden>
+ *  
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *  
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *  
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *  
+ * THIS FILE HAS BEEN AUTOMATICALLY GENERATED FROM avr_tmpl.v.
+ *                     --- DO NOT EDIT MANUALLY! ---
+ */
+
+module $(part)(clk,
+#set exclast=sorted($io_ports)[:-1]
+#set onlylast=sorted($io_ports)[-1:][0]
+#for $Letter in $exclast
+            P$Letter,
+#endfor
+            P$onlylast
+#slurp      
+            );
+   parameter progfile="UNSPECIFIED";
+   input     clk;
+#for $Letter in $io_ports
+##FIXME: Only specify needed bits!  
+   inout [7:0] P$Letter;
+#endfor   
+   integer     handle;
+
+   defparam    core.progfile=progfile;
+   defparam    core.name="$part";
+   AVRCORE core(clk);
+
+#for $Letter in $io_ports
+#set $letter=$Letter.lower
+#for $bit in range(8)
+   avr_pin #("$(Letter)$(bit)") p$(letter)$(bit)(P$(Letter)[$(bit)]);
+#endfor   
+#endfor   
+endmodule
+              
\ No newline at end of file
diff --git a/src/fab/converter.py b/src/fab/converter.py
new file mode 100644
index 0000000..8854290
--- /dev/null
+++ b/src/fab/converter.py
@@ -0,0 +1,95 @@
+# Copyright (C) 2009 Onno Kortmann <address@hidden>
+#  
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#  
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#  
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#  
+class Converter:
+    """ A converter converting parts of the XML description into settings for 
a template. """
+    def __call__(self, xcfg, tmpl):
+        """
+        xcfg: Atmel configuration XML object (DOM tree)
+        tmpl: output template
+        """
+        self.xcfg=xcfg
+        self.tmpl=tmpl
+
+        self.doit(xcfg, tmpl)
+
+def nav(xml, path):
+    """ Navigate in XML object xml. Path is a list of
+    element names to navigate into. Yields a list of all matching elements.
+    """
+#    print "Path:", path
+    if not len(path):
+        return xml.childNodes
+    else:
+        res=[]
+        for c in xml.childNodes:
+#            print "Looking at", c
+            if path[0]=="*" or c.localName==path[0]:
+#                print "Navigating to ", c
+                res.extend(nav(c, path[1:]))
+#                print "done."
+        return res
+    
+def navdir(xml, path, default=True):
+    """ Same as nav, but for a /-separated path. Includes the initial AVRPART/ 
automatically iff def is true. """
+    if default:
+        p="AVRPART/"+path
+    else:
+        p=path
+    return nav(xml, p.split("/"))
+
+def navls(xml, path, default=True):
+    """ Do a 'list directory' for /-separated path path. """
+    for i in navdir(xml, path, default):
+        if i.localName:
+            print i.localName
+
+def navcat(xml, path, default=True):
+    """ Print texts of an XML element. """
+    for i in navdir(xml, path, default):
+        try:
+            print i.wholeText
+        except AttributeError:
+            print "<no attribute wholeText>"
+            
+def navtxt(xml, path, default=True):
+    """ Gives texts of XML element(s). """
+    t=""
+    try:
+        for i in navdir(xml, path, default):
+            t+=i.wholeText
+    except AttributeError, e:
+        raise AttributeError, ("XML-Path:"+str(path)+" : "+str(e))
+    return t
+    
+def avrnum(n):
+    """ Converts a integer number from an AVR XML file.
+    $-numbers and 0x-numbers are treated as hex, ones starting with digits as 
dec. """
+    if n[0]=="$":
+        return int(n[1:], 16)
+    else:
+        return int(n, 0)
+
+def navnum(xml, path, default=True):
+    """ avrnum(navtxt(xml, path) """
+    txt=navtxt(xml, path, default)
+    try:
+        return avrnum(txt)
+    except IndexError:
+        raise IndexError, ("String index out of range in XML tree at '%s'." % 
path)
+    except ValueError:
+        raise ValueError, ("Value '%s' can't be converted into an integer, 
(sub-)tree position '%s', element %s." % (txt, path, xml))
+
diff --git a/src/fab/core.py b/src/fab/core.py
new file mode 100644
index 0000000..eca11c7
--- /dev/null
+++ b/src/fab/core.py
@@ -0,0 +1,118 @@
+# Copyright (C) 2009 Onno Kortmann <address@hidden>
+#  
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#  
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#  
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#  
+from converter import *
+
+class IOReg:
+    def __init__(self, xe):
+        if navtxt(xe, "MEM_ADDR", False)!="NA":
+            self.addr=navnum(xe, "MEM_ADDR", False)
+        else:
+            # FIXME: 0x20 always right?
+            self.addr=0x20+navnum(xe, "IO_ADDR", False)
+            
+        self.name=xe.localName
+        if navtxt(xe, "IO_ADDR", False)!="NA":
+            assert(self.addr==0x20+navnum(xe, "IO_ADDR", False))
+            
+    def __call__(self):
+        return self.addr
+    
+class Core(Converter):
+    def doit(self, xml, tmpl):
+        """ Sets some core parameters. """
+
+
+        regf="CORE/GP_REG_FILE/"
+        (tmpl.reg_num,
+         tmpl.reg_xl, tmpl.reg_xh,
+         tmpl.reg_yl, tmpl.reg_yh,
+         tmpl.reg_zl, tmpl.reg_zh,
+         tmpl.reg_start)=[navnum(xml, s) for s in [
+            regf+"NMB_REG",
+            regf+"X_REG_LOW",
+            regf+"X_REG_HIGH",
+            regf+"Y_REG_LOW",
+            regf+"Y_REG_HIGH",
+            regf+"Z_REG_LOW",
+            regf+"Z_REG_HIGH",
+            regf+"START_ADDR"
+            ]]
+
+        tmpl.part=navtxt(xml, "ADMIN/PART_NAME")
+
+        # in bytes
+        (tmpl.flash_size,
+         tmpl.eeprom_size,
+         tmpl.iram_size) = (
+            navnum(xml, "MEMORY/PROG_FLASH"),
+            navnum(xml, "MEMORY/EEPROM"),
+            navnum(xml, "MEMORY/INT_SRAM/SIZE"))
+
+        if navtxt(xml, "MEMORY/EXT_SRAM/SIZE")!="NA":
+            tmpl.eram_size=navnum(xml, "MEMORY/EXT_SRAM/SIZE")
+        else:
+            tmpl.eram_size=0
+            
+        if tmpl.iram_size:
+            tmpl.iram_start=navnum(xml, "MEMORY/INT_SRAM/START_ADDR")
+        if tmpl.eram_size:
+            tmpl.eram_start=navnum(xml, "MEMORY/EXT_SRAM/START_ADDR")
+
+        tmpl.io_start, tmpl.io_stop=(
+            navnum(xml, "MEMORY/IO_MEMORY/IO_START_ADDR"),
+            navnum(xml, "MEMORY/IO_MEMORY/IO_STOP_ADDR"))
+
+        tmpl.io_size=1+tmpl.io_stop-tmpl.io_start
+
+        # read ioregisters
+        tmpl.io={}
+        for io in navdir(xml, "MEMORY/IO_MEMORY"):
+            if io.nodeType==io.ELEMENT_NODE and 
io.getElementsByTagName("MEM_ADDR"):
+                if io.localName in tmpl.io:
+                    raise Exception, ("I/O-Register '%s' defined twice." % 
io.localName)
+                tmpl.io[io.localName]=IOReg(io)
+
+        tmpl.stack={}
+        if "SPH" in tmpl.io:
+            # FIXME: This is surely not 100% right on all devices!!
+            tmpl.stack["ceil"]=0x10000
+        else:
+            tmpl.stack["ceil"]=0x100
+        
+        self.check(xml, tmpl)
+        
+    def check(self, xml, tmpl):
+        # Some simple checks
+        assert(tmpl.reg_num==32)
+        assert(tmpl.reg_start==0)
+
+        assert(tmpl.io_start==0)
+        assert(tmpl.io_stop==0x3f)
+
+        # some things which should be constant
+        for c, p in [
+            (0x3f, "MEMORY/IO_MEMORY/SREG/IO_ADDR"),
+            (0x01, "MEMORY/IO_MEMORY/SREG/C_MASK"),
+            (0x02, "MEMORY/IO_MEMORY/SREG/Z_MASK"),
+            (0x04, "MEMORY/IO_MEMORY/SREG/N_MASK"),
+            (0x08, "MEMORY/IO_MEMORY/SREG/V_MASK"),
+            (0x10, "MEMORY/IO_MEMORY/SREG/S_MASK"),
+            (0x20, "MEMORY/IO_MEMORY/SREG/H_MASK"),
+            (0x40, "MEMORY/IO_MEMORY/SREG/T_MASK"),
+            (0x80, "MEMORY/IO_MEMORY/SREG/I_MASK")
+            ]:
+            assert(c==navnum(xml, p))
diff --git a/src/fab/eeprom_tmpl.cpp b/src/fab/eeprom_tmpl.cpp
new file mode 100644
index 0000000..1712f2b
--- /dev/null
+++ b/src/fab/eeprom_tmpl.cpp
@@ -0,0 +1,30 @@
+## Copyright (C) 2009 Onno Kortmann <address@hidden>
+##  
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##  
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU General Public License for more details.
+##  
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+##  
+##FIXME: any other eeprom types?
+##FIXME#2: using right eeprom type?
+{
+#if "EE_RDY" in $irq_bysrc
+       eeprom = new HWMegaEeprom(this, irqSystem, $eeprom_size, 
$irq_bysrc["EE_RDY"].addr);
+#else
+       eeprom = new HWEeprom(this, irqSystem, $eeprom_size);
+#endif    
+#if "EEAR" in $io
+       rw[$io["EEAR"].addr]= new RWEearl(this, eeprom);
+       rw[$io["EEDR"].addr]= new RWEedr(this, eeprom);
+       rw[$io["EECR"].addr]= new RWEecr(this, eeprom);
+#endif
+}
diff --git a/src/fab/irq.py b/src/fab/irq.py
new file mode 100644
index 0000000..00d36d1
--- /dev/null
+++ b/src/fab/irq.py
@@ -0,0 +1,50 @@
+# Copyright (C) 2009 Onno Kortmann <address@hidden>
+#  
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#  
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#  
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#  
+from converter import *
+
+class IRQVector:
+    def __init__(self, xml, n):
+        path="INTERRUPT_VECTOR/VECTOR%d/" % (n+1)
+        self.addr=navnum(xml, path+"PROGRAM_ADDRESS")
+        self.src=navtxt(xml, path+"SOURCE") # source of interrupt
+
+        # the EEPROM ready interrupt seems to be named different for each 
device...
+        if (self.src=="EEPROM Ready" or
+            self.src=="EE READY" or
+            self.src=="EE_READY"):
+            self.src="EE_RDY"
+            
+        self.desc=navtxt(xml,  path+"DEFINITION") # description
+
+class IRQTable(Converter):
+    def doit(self, xml, tmpl):
+        tmpl.irq_num=navnum(xml, "INTERRUPT_VECTOR/NMB_VECTORS")
+        tmpl.irq_vec_size=2 # FIXME!!
+        tmpl.irqs=[]
+        for i in range(tmpl.irq_num):
+            # FIXME: for some reason, irq_num can be different to the number 
of declared vectors.
+            # example is the AT90USB162.
+            if navtxt(xml, "INTERRUPT_VECTOR/VECTOR%d/PROGRAM_ADDRESS" % 
(i+1)):
+                tmpl.irqs.append(IRQVector(xml, i))
+
+        # map source to interrupts
+        tmpl.irq_bysrc={}
+        for i in tmpl.irqs:
+            if i.src in tmpl.irq_bysrc:
+                raise Exception, ("At least two interrupts with the same 
source %s." % i.src)
+            tmpl.irq_bysrc[i.src]=i
+        
diff --git a/src/fab/pins.py b/src/fab/pins.py
new file mode 100644
index 0000000..110a747
--- /dev/null
+++ b/src/fab/pins.py
@@ -0,0 +1,52 @@
+# Copyright (C) 2009 Onno Kortmann <address@hidden>
+#  
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#  
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#  
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#  
+from converter import *
+
+def sls(s):
+    return s.replace("[", "").replace("]", "").split(":")
+    
+# FIXME: Support different package types!
+class Pins(Converter):
+    def doit(self, xml, tmpl):
+        tmpl.pkg_types=sls(navtxt(xml, "PACKAGE/PACKAGES"))
+
+        p=tmpl.pkg_types[0]
+        tmpl.pkg_pincnt=navnum(xml, "PACKAGE/%s/NMB_PIN" % p)
+
+        tmpl.pkg_pins=[]
+        tmpl.pkg_portlet={} # mapping of pkg_pins indices to port letters 
(lower case)
+        tmpl.pkg_portbit={} # mapping of pkg_pins indices to port bits
+        
+        for i in range(1, tmpl.pkg_pincnt+1):
+            s=sls(navtxt(xml, "PACKAGE/%s/PIN%d/NAME" % (p, i)))
+            port=False
+            portlet=None
+            portbit=None
+            for sl in s:
+                if len(sl)==3 and sl[0]=="P":
+                    if port:
+                        raise Exception, "Weird PACKAGE/.../PIN structure."
+                    portlet=sl[1].lower()
+                    portbit=int(sl[2])
+                    port=True
+
+            for sl in s:
+                tmpl.pkg_portlet[sl]=portlet
+                tmpl.pkg_portbit[sl]=portbit
+
+            tmpl.pkg_pins.append(s)
+
diff --git a/src/fab/port.py b/src/fab/port.py
new file mode 100644
index 0000000..a1b52dd
--- /dev/null
+++ b/src/fab/port.py
@@ -0,0 +1,47 @@
+# Copyright (C) 2009 Onno Kortmann <address@hidden>
+#  
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#  
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#  
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#  
+from converter import *
+
+class Port:
+    def __init__(self, xml, letter):
+        self.letter=letter # upper case port letter (PORTB -> 'B', etc.)
+        pre="IO_MODULE/PORT%s/" % letter
+
+        for s, us in [("port_", "PORT%s/"),
+                      ("pin_", "PIN%s/"),
+                      ("ddr_", "DDR%s/")]:
+            for e in ["mask", "wmask", "imask"]:
+                self.__dict__[s+e]=0x00
+
+            for i in range(8):
+                if navdir(xml, (pre+us+"BIT%d") % (letter, i)):
+                    self.__dict__[s+"mask"]|=1<<i
+                    assert(navtxt(xml,    (pre+us+"BIT%d/ACCESS") % (letter, 
i)) in ["R", "RW"])
+                
+                    if "W" in navtxt(xml,    (pre+us+"BIT%d/ACCESS") % 
(letter, i)):
+                        self.__dict__[s+"wmask"]|=1<<i
+                    if navtxt(xml,   (pre+us+"BIT%d/INIT_VAL") % (letter, i)):
+                        self.__dict__[s+"imask"]|=1<<i
+        
+    
+class Ports(Converter):
+    def doit(self, xml, tmpl):
+        tmpl.io_ports={}
+        for l in "ABCDEF":
+            if navdir(xml, "IO_MODULE/PORT%s" % l):
+                tmpl.io_ports[l]=self.__dict__["port"+l.lower()]=Port(xml, l)
+
diff --git a/src/fab/port_tmpl.cpp b/src/fab/port_tmpl.cpp
new file mode 100644
index 0000000..01735ad
--- /dev/null
+++ b/src/fab/port_tmpl.cpp
@@ -0,0 +1,44 @@
+## Copyright (C) 2009 Onno Kortmann <address@hidden>
+##  
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##  
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU General Public License for more details.
+##  
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+##  
+
+#for $Letter in $io_ports
+#set $letter=$Letter.lower    
+#set $port=$io_ports[$Letter]
+##    
+#if ("PIN"+$Letter) in $io
+    port$letter=new HWPort(this, "$Letter");
+#else
+    // output-only port
+    port$letter=new HWPort(this, "$Letter", 0xff);
+#endif
+##    
+#if ("PORT"+$Letter) in $io
+    rw[$io["PORT"+$Letter].addr]=new RWPort(this, port$letter);
+#endif
+##    
+## some ports are output only (e.g. mega103/portc)
+## some other ports are input only (e.g. mega103/portf)
+#if ("PIN"+$Letter) in $io
+    rw[$io["PIN"+$Letter].addr]=new RWPin (this, port$letter);
+    #if ("PORT"+$Letter) in $io
+    rw[$io["DDR"+$Letter].addr]=new RWDdr (this, port$letter);
+    #else
+    // ^^ input-only port
+    #endif
+  #endif
+
+#endfor
diff --git a/src/fab/timer.py b/src/fab/timer.py
new file mode 100644
index 0000000..23c5d66
--- /dev/null
+++ b/src/fab/timer.py
@@ -0,0 +1,29 @@
+# Copyright (C) 2009 Onno Kortmann <address@hidden>
+#  
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#  
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#  
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#  
+from converter import *
+
+class Timer(Converter):
+    def doit(self, xml, tmpl):
+        # there does not seem to be a timerless device
+        tmpl.has_prescaler=True
+        try:
+            tmpl.has_timer1=navtxt(xml, 
"IO_MODULE/TIMER_COUNTER_1/ID")[:3]=="t16"
+        except:
+            tmpl.has_timer1=False
+            
+
+            
diff --git a/src/fab/timer_tmpl.cpp b/src/fab/timer_tmpl.cpp
new file mode 100644
index 0000000..142ad63
--- /dev/null
+++ b/src/fab/timer_tmpl.cpp
@@ -0,0 +1,48 @@
+## Copyright (C) 2009 Onno Kortmann <address@hidden>
+##  
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##  
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU General Public License for more details.
+##  
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+##  
+{
+#if $has_timer1
+    timer01irq = new HWTimer01Irq(this,
+                                  irqSystem,
+                                  $irq_bysrc["TIMER1 CAPT"].addr,
+                                  $irq_bysrc["TIMER1 COMPA"].addr,
+                                  $irq_bysrc["TIMER1 COMPB"].addr,
+                                  $irq_bysrc["TIMER1 OVF"].addr,
+                                  $irq_bysrc["TIMER0 OVF"].addr
+                                  );
+
+    timer1     = new HWTimer1(this,
+                              prescaler,
+                              timer01irq,
+                              
PinAtPort(port$pkg_portlet["T1"],$pkg_portbit["T1"]),
+                              
PinAtPort(port$pkg_portlet["OC1A"],$pkg_portbit["OC1A"]),
+                              
PinAtPort(port$pkg_portlet["OC1B"],$pkg_portbit["OC1B"]),
+                              
PinAtPort(port$pkg_portlet["ICP"],$pkg_portbit["ICP"]));
+
+    rw[$io["TIMSK"].addr]= new RWTimsk(this, timer01irq);
+    rw[$io["TIFR"].addr]= new RWTifr(this, timer01irq);
+    rw[$io["TCCR1A"].addr]= new RWTccra(this, timer1);
+    rw[$io["TCCR1B"].addr]= new RWTccrb(this, timer1);
+    rw[$io["TCNT1H"].addr]= new RWTcnth(this, timer1);
+    rw[$io["TCNT1L"].addr]= new RWTcntl(this, timer1);
+    rw[$io["OCR1AH"].addr]= new RWOcrah(this, timer1);
+    rw[$io["OCR1AL"].addr]= new RWOcral(this, timer1);
+
+    rw[$io["ICR1H"].addr]= new RWIcrh(this, timer1);
+    rw[$io["ICR1L"].addr]= new RWIcrl(this, timer1);
+#endif                                         
+}
diff --git a/src/hwdecls.h b/src/hwdecls.h
new file mode 100644
index 0000000..cd41eec
--- /dev/null
+++ b/src/hwdecls.h
@@ -0,0 +1,20 @@
+#ifndef HWDECLS_H
+#define HWDECLS_H
+//-----------------------------------------------------------------------------
+/* List of all hardware class declarations, to be used with the automatically
+   generated AVR device classes. */
+class HWPort;
+class HWSpi;
+class HWUart;
+class HWAcomp;
+class HWPrescaler;
+class HWTimer0;
+class HWTimer1;
+class HWMcucr;
+class HWExtIrq;
+class HWTimer01Irq;
+class HWAdmux;
+class HWAd;
+class HWMcucr;
+//-----------------------------------------------------------------------------
+#endif
-- 
1.5.6.5






reply via email to

[Prev in Thread] Current Thread [Next in Thread]