bank.c 2.74 KB
/*====================================================================
 * bank.c
 *
 * Synopsis:
 *
 * Copyright 1993, Silicon Graphics, Inc.
 * All Rights Reserved.
 *
 * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics,
 * Inc.; the contents of this file may not be disclosed to third
 * parties, copied or duplicated in any form, in whole or in part,
 * without the prior written permission of Silicon Graphics, Inc.
 *
 * RESTRICTED RIGHTS LEGEND:
 * Use, duplication or disclosure by the Government is subject to
 * restrictions as set forth in subdivision (c)(1)(ii) of the Rights
 * in Technical Data and Computer Software clause at DFARS
 * 252.227-7013, and/or in similar or successor clauses in the FAR,
 * DOD or NASA FAR Supplement. Unpublished - rights reserved under the
 * Copyright Laws of the United States.
 *====================================================================*/

#include <assert.h>
#include <stdlib.h>
#include "ic.h"

#define MAX_PROGRAMS    128

ICBank  *curBank = 0;

typedef struct {
    ICInst      *i;
    int         number; /* program number */
} Program;

void bankNew(ICBank *b)
{
    b->decl.declclass = ICBANK;
    b->decl.id = objectID++;
    b->decl.offset = (void *)-1;                
    b->decl.size = sizeof(ALBank) - sizeof(ALInstrument *); /* size in file */
    
    listNew(&b->progList);

    b->maxPrograms = -1;
    b->bank = 0;
}

void bankAddProgram(ICBank *b, ICInst *i, int number)
{
    Program *p = calloc(1, sizeof(Program));
    assert(p);

    p->i = i;
    p->number = number;
    
    listAppend(&b->progList, p);

    b->maxPrograms = MAX(b->maxPrograms, number);
    b->decl.size = sizeof(ALBank) + (b->maxPrograms+1)*sizeof(ALBank *);
}

void bankLayOut(ICBank *icb)
{
    ALBank        *b;
    Node        *obj;
    int         bsize;

    icb->decl.size = declSize((Decl *)icb);    
    b = calloc(1, icb->decl.size);
    assert(b);

    if (icb->maxPrograms != -1) {
        b->progCount = icb->maxPrograms + 1;
    } else {
        b->progCount = 0;
    }
    
    /* ### should init the array with a default program */
    for (obj = icb->progList.head; obj != 0; obj = obj->next) {
        Program *p= obj->data;
        ICInst  *i = p->i;
        b->progArray[p->number] = i->decl.offset;
    }
    
    icb->bank = b;
}

void bankPrint(ICBank *icb)
{
    ALBank *b = icb->bank;
    Id   *name;
    int  i;
    
    name = findname((Decl *)icb);
    
    printf("Bank: %s\n", name->name);
    declPrint((Decl *)icb);
    
    printf("\tprogCount:\t= %d\n", b->progCount);
    
    for (i = 0; i < b->progCount; i++) {
        printf("\tprogram[%d] = \t%x\n", i, b->progArray[i]);
    }

    printf("\n");
}

void bankWrite(ICBank *icb, FILE *file)
{
    fwrite(icb->bank, icb->decl.size, 1, file);
}