/*
 * wiring.h --
 *
 * Contains definitions for things that are exported by the
 * wiring module.
 *
 *     *********************************************************************
 *     * Copyright (C) 1985, 1990 Regents of the University of California. *
 *     * Permission to use, copy, modify, and distribute this              *
 *     * software and its documentation for any purpose and without        *
 *     * fee is hereby granted, provided that the above copyright          *
 *     * notice appear in all copies.  The University of California        *
 *     * makes no representations about the suitability of this            *
 *     * software for any purpose.  It is provided "as is" without         *
 *     * express or implied warranty.  Export of this software outside     *
 *     * of the United States of America may require an export license.    *
 *     *********************************************************************
 *
 * rcsid $Header$
 */

#ifndef _MAGIC__WIRING__WIRING_H
#define _MAGIC__WIRING__WIRING_H

#include "utils/magic.h"
#include "database/database.h"

/* Table that defines the shape of contacts and the layers that they
 * connect.  This definition allows some layers to extend around the
 * contact, to support technologies where the contact pads are different
 * sizes for the different layers that the contact connects.
 */

typedef struct _Contact *ContactPtr;

typedef struct _Contact
{
    TileType con_type;		/* Type of material that forms core of
				 * contact.
				 */
    int con_size;		/* Minimum size of this contact (size of
				 * minimum con_type area).
				 */
    TileType con_layer1;	/* First of two layers that the contact
				 * really isn't a contact.
				 */
    int con_surround1;		/* How much additional material of type
				 * con_layer1 must be painted around the
				 * edge of the contact.
				 */
    int con_extend1;		/* How much additional material of type
				 * con_layer1 must extend beyond the
				 * contact in the orientation of the route.
				 */
    TileType con_layer2;	/* Same information for second layer that
				 * the contact connects.
				 */
    int con_surround2;
    int con_extend2;

    ContactPtr con_next;	/* Pointer to next contact record */
} Contact;

extern Contact *WireContacts;	/* Points to all the contacts that are
				 * defined. */

/* Types defining the current state of the wiring tool */
extern TileType WireType;	/* Type of material currently selected
				 * for wiring.
				 */
extern int WireWidth;		/* Thickness of material to use for wiring. */

/* Procedures for placing wires: */

extern void WirePickType(TileType type, const Point *ppoint, int width);
extern void WireAddLeg(Rect *rect, const Point *point, int direction);
extern void WireAddContact(TileType newType, int newWidth);
extern void WireShowLeg(void);
extern int WireGetWidth(void);
extern TileType WireGetType(void);

/* Legal values for the "direction" parameter to WireAddLeg: */

#define WIRE_CHOOSE 0
#define WIRE_HORIZONTAL 1
#define WIRE_VERTICAL 2

/* Procedures for reading the technology file: */

extern void WireTechInit(void);
extern bool WireTechLine(const char *sectionName, int argc, char *argv[]);
extern void WireTechFinal(void);
extern void WireTechScale(int scalen, int scaled);

/* Initialization: */

extern void WireInit(void);

#endif /* _MAGIC__WIRING__WIRING_H */
