HARM-0.1.2: Arm/Program.hs
----------------------------------------------------------------------
-- FILE: Program.hs
-- DATE: 03/07/2001
-- PROJECT: HARM (was VARM (Virtual ARM)), for CSE240 Spring 2001
-- LANGUAGE PLATFORM: HUGS
-- OS PLATFORM: RedHat Linux 6.2
-- AUTHOR: Jeffrey A. Meunier
-- EMAIL: jeffm@cse.uconn.edu
-- MAINTAINER: Alex Mason
-- EMAIL: axman6@gmail.com
----------------------------------------------------------------------
module Arm.Program
where
----------------------------------------------------------------------
-- Standard libraries.
----------------------------------------------------------------------
import Data.Word
----------------------------------------------------------------------
-- Local libraries.
----------------------------------------------------------------------
import Arm.Instruction
import Arm.Memory
import Arm.RegisterName
----------------------------------------------------------------------
-- Constant data type. This allows us to represent constant
-- data values in our program (although when the program runs, the
-- values can potentially change, so they are not really constants).
----------------------------------------------------------------------
data Constant
= Array Word32 Constant
| Int Int
| List [Constant]
| String String
| Word Word32
deriving Show
----------------------------------------------------------------------
-- Get the size of a constant.
----------------------------------------------------------------------
constSize
:: Constant
-> Word32
constSize (Array i c) = i * constSize c
constSize (Int _) = 4
constSize (List l) = foldl (+) 0 (map constSize l)
constSize (String s) = fromIntegral ((length s `div` 4 + 1) * 4)
constSize (Word _) = 4
----------------------------------------------------------------------
-- Program data type. A program has an origin, a list of instructions,
-- and a list of constants.
----------------------------------------------------------------------
data Program
= Program
{ memorySize :: Address -- required number of bytes
, origin :: Address -- program origin
, regInit :: [(RegisterName, Word32)] -- initial register values
, instructions :: [Instruction] -- list of instructions
, constants :: [(Address, Constant)] -- list of constants
}
deriving Show
----------------------------------------------------------------------
-- eof
----------------------------------------------------------------------