OpenCores
URL https://opencores.org/ocsvn/or1k_old/or1k_old/trunk

Subversion Repositories or1k_old

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /or1k_old/trunk/rc203soc/sw/uClinux/include/asm-armnommu/arch-a5k
    from Rev 1765 to Rev 1782
    Reverse comparison

Rev 1765 → Rev 1782

/irq.h
0,0 → 1,86
/*
* include/asm-arm/arch-a5k/irq.h
*
* Copyright (C) 1996 Russell King
*
* Changelog:
* 24-09-1996 RMK Created
* 10-10-1996 RMK Brought up to date with arch-sa110eval
* 22-10-1996 RMK Changed interrupt numbers & uses new inb/outb macros
*/
 
#define BUILD_IRQ(s,n,m) \
void IRQ##n##_interrupt(void); \
void fast_IRQ##n##_interrupt(void); \
void bad_IRQ##n##_interrupt(void); \
void probe_IRQ##n##_interrupt(void);
 
/*
* The timer is a special interrupt
*/
#define IRQ5_interrupt timer_IRQ_interrupt
 
#define IRQ_INTERRUPT(n) IRQ##n##_interrupt
#define FAST_INTERRUPT(n) fast_IRQ##n##_interrupt
#define BAD_INTERRUPT(n) bad_IRQ##n##_interrupt
#define PROBE_INTERRUPT(n) probe_IRQ##n##_interrupt
static __inline__ void mask_irq(unsigned int irq)
{
extern void ecard_disableirq (unsigned int);
extern void ecard_disablefiq (unsigned int);
unsigned char mask = 1 << (irq & 7);
 
switch (irq >> 3) {
case 0:
outb(inb(IOC_IRQMASKA) & ~mask, IOC_IRQMASKA);
break;
case 1:
outb(inb(IOC_IRQMASKB) & ~mask, IOC_IRQMASKB);
break;
case 4:
ecard_disableirq (irq & 7);
break;
case 8:
outb(inb(IOC_FIQMASK) & ~mask, IOC_FIQMASK);
break;
case 12:
ecard_disablefiq (irq & 7);
}
}
 
static __inline__ void unmask_irq(unsigned int irq)
{
extern void ecard_enableirq (unsigned int);
extern void ecard_enablefiq (unsigned int);
unsigned char mask = 1 << (irq & 7);
 
switch (irq >> 3) {
case 0:
outb(inb(IOC_IRQMASKA) | mask, IOC_IRQMASKA);
break;
case 1:
outb(inb(IOC_IRQMASKB) | mask, IOC_IRQMASKB);
break;
case 4:
ecard_enableirq (irq & 7);
break;
case 8:
outb(inb(IOC_FIQMASK) | mask, IOC_FIQMASK);
break;
case 12:
ecard_enablefiq (irq & 7);
}
}
 
static __inline__ unsigned long get_enabled_irqs(void)
{
return inb(IOC_IRQMASKA) | inb(IOC_IRQMASKB) << 8;
}
 
static __inline__ void irq_init_irq(void)
{
outb(0, IOC_IRQMASKA);
outb(0, IOC_IRQMASKB);
outb(0, IOC_FIQMASK);
}
/hardware.h
0,0 → 1,74
/*
* linux/include/asm-arm/arch-a5k/hardware.h
*
* Copyright (C) 1996 Russell King.
*
* This file contains the hardware definitions of the A5000 series machines.
*/
 
#ifndef __ASM_ARCH_HARDWARE_H
#define __ASM_ARCH_HARDWARE_H
 
/*
* What hardware must be present
*/
#define HAS_IOC
#define HAS_MEMC
#define HAS_MEMC1A
#define HAS_VIDC
 
/*
* Optional hardware
*/
#define HAS_EXPMASK
 
#define IO_START 0x03000000
#define IO_SIZE 0x01000000
#define IO_BASE 0x03000000
 
#define SCREEN_START 0x02000000 /* Screen */
#define SCREEN2_END 0x02078000
#define SCREEN2_BASE 0x02000000
#define SCREEN1_END 0x02000000
#define SCREEN1_BASE 0x01f88000
 
 
#ifndef __ASSEMBLER__
 
/*
* for use with inb/outb
*/
#define IO_VIDC_BASE 0x80100000
#define IO_IOC_BASE 0x80080000
 
#define IO_EC_IOC4_BASE 0x8009c000
#define IO_EC_IOC_BASE 0x80090000
#define IO_EC_MEMC_BASE 0x80000000
 
/*
* IO definitions
*/
#define EXPMASK_BASE ((volatile unsigned char *)0x03360000)
#define IOEB_BASE ((volatile unsigned char *)0x03350050)
#define PCIO_FLOPPYDMABASE ((volatile unsigned char *)0x0302a000)
#define PCIO_BASE 0x03010000
 
/*
* RAM definitions
*/
#define MAPTOPHYS(a) (((unsigned long)a & 0x007fffff) + PAGE_OFFSET)
#define KERNTOPHYS(a) ((((unsigned long)(&a)) & 0x007fffff) + PAGE_OFFSET)
#define GET_MEMORY_END(p) (PAGE_OFFSET + (p->u1.s.page_size) * (p->u1.s.nr_pages))
#define PARAMS_BASE (PAGE_OFFSET + 0x7c000)
#define KERNEL_BASE (PAGE_OFFSET + 0x80000)
 
#else
 
#define IOEB_BASE 0x03350050
#define IOC_BASE 0x03200000
#define PCIO_FLOPPYDMABASE 0x0302a000
#define PCIO_BASE 0x03010000
 
#endif
#endif
 
/irqs.h
0,0 → 1,28
/*
* linux/include/asm-arm/arch-a5k/irqs.h
*
* Copyright (C) 1996 Russell King
*/
 
#define IRQ_PRINTER 0
#define IRQ_BATLOW 1
#define IRQ_FLOPPYINDEX 2
#define IRQ_VSYNCPULSE 3
#define IRQ_POWERON 4
#define IRQ_TIMER0 5
#define IRQ_TIMER1 6
#define IRQ_IMMEDIATE 7
#define IRQ_EXPCARDFIQ 8
#define IRQ_SOUNDCHANGE 9
#define IRQ_SERIALPORT 10
#define IRQ_HARDDISK 11
#define IRQ_FLOPPYDISK 12
#define IRQ_EXPANSIONCARD 13
#define IRQ_KEYBOARDTX 14
#define IRQ_KEYBOARDRX 15
 
#define FIQ_FLOPPYDATA 0
#define FIQ_ECONET 2
#define FIQ_SERIALPORT 4
#define FIQ_EXPANSIONCARD 6
#define FIQ_FORCE 7
/mmu.h
0,0 → 1,22
/*
* linux/include/asm-arm/arch-a5k/mmu.h
*
* Copyright (c) 1996 Russell King.
*
* Changelog:
* 22-11-1996 RMK Created
*/
#ifndef __ASM_ARCH_MMU_H
#define __ASM_ARCH_MMU_H
 
#define __virt_to_phys__is_a_macro
#define __virt_to_phys(vpage) vpage
#define __phys_to_virt__is_a_macro
#define __phys_to_virt(ppage) ppage
 
#define __virt_to_bus__is_a_macro
#define __virt_to_bus(vpage) vpage
#define __bus_to_virt__is_a_macro
#define __bus_to_virt(ppage) ppage
 
#endif
/time.h
0,0 → 1,96
/*
* linux/include/asm-arm/arch-a5k/time.h
*
* Copyright (c) 1996 Russell King.
*
* Changelog:
* 24-Sep-1996 RMK Created
* 10-Oct-1996 RMK Brought up to date with arch-sa110eval
* 04-Dec-1997 RMK Updated for new arch/arm/time.c
*/
 
extern __inline__ unsigned long gettimeoffset (void)
{
unsigned int count1, count2, status1, status2;
unsigned long offset = 0;
 
status1 = inb(IOC_IRQREQA);
barrier ();
outb (0, IOC_T0LATCH);
barrier ();
count1 = inb(IOC_T0CNTL) | (inb(IOC_T0CNTH) << 8);
barrier ();
status2 = inb(IOC_IRQREQA);
barrier ();
outb (0, IOC_T0LATCH);
barrier ();
count2 = inb(IOC_T0CNTL) | (inb(IOC_T0CNTH) << 8);
 
if (count2 < count1) {
/*
* This means that we haven't just had an interrupt
* while reading into status2.
*/
if (status2 & (1 << 5))
offset = tick;
count1 = count2;
} else if (count2 > count1) {
/*
* We have just had another interrupt while reading
* status2.
*/
offset += tick;
count1 = count2;
}
 
count1 = LATCH - count1;
/*
* count1 = number of clock ticks since last interrupt
*/
offset += count1 * tick / LATCH;
return offset;
}
 
/*
* No need to reset the timer at every irq
*/
#define reset_timer() 1
 
/*
* Updating of the RTC. We don't currently write the time to the
* CMOS clock.
*/
#define update_rtc()
 
/*
* Set up timer interrupt, and return the current time in seconds.
*/
extern __inline__ unsigned long setup_timer (void)
{
extern int iic_control (unsigned char, int, char *, int);
unsigned int year, mon, day, hour, min, sec;
char buf[8];
 
outb(LATCH & 255, IOC_T0LTCHL);
outb(LATCH >> 8, IOC_T0LTCHH);
outb(0, IOC_T0GO);
 
iic_control (0xa0, 0xc0, buf, 1);
year = buf[0];
if ((year += 1900) < 1970)
year += 100;
 
iic_control (0xa0, 2, buf, 5);
mon = buf[4] & 0x1f;
day = buf[3] & 0x3f;
hour = buf[2];
min = buf[1];
sec = buf[0];
BCD_TO_BIN(mon);
BCD_TO_BIN(day);
BCD_TO_BIN(hour);
BCD_TO_BIN(min);
BCD_TO_BIN(sec);
 
return mktime(year, mon, day, hour, min, sec);
}
/uncompress.h
0,0 → 1,104
/*
* linux/include/asm-arm/arch-a5k/uncompress.h
*
* Copyright (C) 1996 Russell King
*/
#define VIDMEM ((char *)0x02000000)
#include "../arch/arm/drivers/char/font.h"
 
int video_num_columns, video_num_lines, video_size_row;
int white, bytes_per_char_h;
extern unsigned long con_charconvtable[256];
 
struct param_struct {
unsigned long page_size;
unsigned long nr_pages;
unsigned long ramdisk_size;
unsigned long mountrootrdonly;
unsigned long rootdev;
unsigned long video_num_cols;
unsigned long video_num_rows;
unsigned long video_x;
unsigned long video_y;
unsigned long memc_control_reg;
unsigned char sounddefault;
unsigned char adfsdrives;
unsigned char bytes_per_char_h;
unsigned char bytes_per_char_v;
unsigned long unused[256/4-11];
};
 
static struct param_struct *params = (struct param_struct *)0x0207c000;
/*
* This does not append a newline
*/
static void puts(const char *s)
{
extern void ll_write_char(char *, unsigned long);
int x,y;
unsigned char c;
char *ptr;
 
x = params->video_x;
y = params->video_y;
 
while ( ( c = *(unsigned char *)s++ ) != '\0' ) {
if ( c == '\n' ) {
x = 0;
if ( ++y >= video_num_lines ) {
y--;
}
} else {
ptr = VIDMEM + ((y*video_num_columns*params->bytes_per_char_v+x)*bytes_per_char_h);
ll_write_char(ptr, c|(white<<8));
if ( ++x >= video_num_columns ) {
x = 0;
if ( ++y >= video_num_lines ) {
y--;
}
}
}
}
 
params->video_x = x;
params->video_y = y;
}
 
static void error(char *x);
 
/*
* Setup for decompression
*/
static void arch_decomp_setup(void)
{
int i;
video_num_lines = params->video_num_rows;
video_num_columns = params->video_num_cols;
bytes_per_char_h = params->bytes_per_char_h;
video_size_row = video_num_columns * bytes_per_char_h;
if (bytes_per_char_h == 4)
for (i = 0; i < 256; i++)
con_charconvtable[i] =
(i & 128 ? 1 << 0 : 0) |
(i & 64 ? 1 << 4 : 0) |
(i & 32 ? 1 << 8 : 0) |
(i & 16 ? 1 << 12 : 0) |
(i & 8 ? 1 << 16 : 0) |
(i & 4 ? 1 << 20 : 0) |
(i & 2 ? 1 << 24 : 0) |
(i & 1 ? 1 << 28 : 0);
else
for (i = 0; i < 16; i++)
con_charconvtable[i] =
(i & 8 ? 1 << 0 : 0) |
(i & 4 ? 1 << 8 : 0) |
(i & 2 ? 1 << 16 : 0) |
(i & 1 ? 1 << 24 : 0);
 
white = bytes_per_char_h == 8 ? 0xfc : 7;
 
if (params->nr_pages * params->page_size < 4096*1024) error("<4M of mem\n");
}
/processor.h
0,0 → 1,28
/*
* linux/include/asm-arm/arch-a5k/processor.h
*
* Copyright (c) 1996 Russell King.
*
* Changelog:
* 10-09-1996 RMK Created
*/
 
#ifndef __ASM_ARCH_PROCESSOR_H
#define __ASM_ARCH_PROCESSOR_H
 
/*
* Bus types
*/
#define EISA_bus 0
#define EISA_bus__is_a_macro /* for versions in ksyms.c */
#define MCA_bus 0
#define MCA_bus__is_a_macro /* for versions in ksyms.c */
 
/*
* User space: 26MB
*/
#define TASK_SIZE (0x01a00000UL)
 
#define INIT_MMAP { &init_mm, 0, 0x02000000, PAGE_SHARED, VM_READ | VM_WRITE | VM_EXEC }
 
#endif
/serial.h
0,0 → 1,40
/*
* linux/include/asm-arm/arch-a5k/serial.h
*
* Copyright (c) 1996 Russell King.
*
* Changelog:
* 15-10-1996 RMK Created
*/
#ifndef __ASM_ARCH_SERIAL_H
#define __ASM_ARCH_SERIAL_H
 
/*
* This assumes you have a 1.8432 MHz clock for your UART.
*
* It'd be nice if someone built a serial card with a 24.576 MHz
* clock, since the 16550A is capable of handling a top speed of 1.5
* megabits/second; but this requires the faster clock.
*/
#define BASE_BAUD (1843200 / 16)
 
#define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST)
 
/* UART CLK PORT IRQ FLAGS */
#define RS_UARTS \
{ 0, BASE_BAUD, 0x3F8, 10, STD_COM_FLAGS }, /* ttyS0 */ \
{ 0, BASE_BAUD, 0x2F8, 10, STD_COM_FLAGS }, /* ttyS1 */ \
{ 0, BASE_BAUD, 0 , 0, STD_COM_FLAGS }, /* ttyS2 */ \
{ 0, BASE_BAUD, 0 , 0, STD_COM_FLAGS }, /* ttyS3 */ \
{ 0, BASE_BAUD, 0 , 0, STD_COM_FLAGS }, /* ttyS4 */ \
{ 0, BASE_BAUD, 0 , 0, STD_COM_FLAGS }, /* ttyS5 */ \
{ 0, BASE_BAUD, 0 , 0, STD_COM_FLAGS }, /* ttyS6 */ \
{ 0, BASE_BAUD, 0 , 0, STD_COM_FLAGS }, /* ttyS7 */ \
{ 0, BASE_BAUD, 0 , 0, STD_COM_FLAGS }, /* ttyS8 */ \
{ 0, BASE_BAUD, 0 , 0, STD_COM_FLAGS }, /* ttyS9 */ \
{ 0, BASE_BAUD, 0 , 0, STD_COM_FLAGS }, /* ttyS10 */ \
{ 0, BASE_BAUD, 0 , 0, STD_COM_FLAGS }, /* ttyS11 */ \
{ 0, BASE_BAUD, 0 , 0, STD_COM_FLAGS }, /* ttyS12 */ \
{ 0, BASE_BAUD, 0 , 0, STD_COM_FLAGS }, /* ttyS13 */
 
#endif
/dma.h
0,0 → 1,24
#ifndef __ASM_ARCH_DMA_H
#define __ASM_ARCH_DMA_H
 
/*
* This is the maximum DMA address that can be DMAd to.
*/
#define MAX_DMA_ADDRESS 0x03000000
 
/*
* DMA modes - we have two, IN and OUT
*/
typedef enum {
DMA_MODE_READ,
DMA_MODE_WRITE
} dmamode_t;
 
#define MAX_DMA_CHANNELS 2
#define DMA_VIRTUAL_FLOPPY 0
#define DMA_VIRTUAL_SOUND 1
 
#define DMA_FLOPPY DMA_VIRTUAL_FLOPPY
 
#endif /* _ASM_ARCH_DMA_H */
 
/oldlatches.h
0,0 → 1,9
/*
* Dummy oldlatches.h
*
* Copyright (C) 1996 Russell King
*/
 
#ifdef __need_oldlatches
#error "Old latches not present in this (a5k) machine"
#endif
/system.h
0,0 → 1,30
/*
* linux/include/asm-arm/arch-a5k/system.h
*
* Copyright (c) 1996 Russell King
*/
#ifndef __ASM_ARCH_SYSTEM_H
#define __ASM_ARCH_SYSTEM_H
 
extern __inline__ void arch_hard_reset (void)
{
extern void ecard_reset (int card);
 
/*
* Reset all expansion cards.
*/
ecard_reset (-1);
 
/*
* copy branch instruction to reset location and call it
*/
*(unsigned long *)0 = *(unsigned long *)0x03800000;
((void(*)(void))0)();
 
/*
* If that didn't work, loop endlessly
*/
while (1);
}
 
#endif
/a.out.h
0,0 → 1,16
/*
* linux/include/asm-arm/arch-a5k/a.out.h
*
* Copyright (C) 1996 Russell King
*/
 
#ifndef __ASM_ARCH_A_OUT_H
#define __ASM_ARCH_A_OUT_H
 
#ifdef __KERNEL__
#define STACK_TOP (0x01a00000)
#define LIBRARY_START_TEXT (0x00c00000)
#endif
 
#endif
 
/io.h
0,0 → 1,201
/*
* linux/include/asm-arm/arch-a5k/io.h
*
* Copyright (C) 1997 Russell King
*
* Modifications:
* 06-Dec-1997 RMK Created.
*/
#ifndef __ASM_ARM_ARCH_IO_H
#define __ASM_ARM_ARCH_IO_H
 
/*
* This architecture does not require any delayed IO, and
* has the constant-optimised IO
*/
#undef ARCH_IO_DELAY
 
/*
* We use two different types of addressing - PC style addresses, and ARM
* addresses. PC style accesses the PC hardware with the normal PC IO
* addresses, eg 0x3f8 for serial#1. ARM addresses are 0x80000000+
* and are translated to the start of IO. Note that all addresses are
* shifted left!
*/
#define __PORT_PCIO(x) (!((x) & 0x80000000))
 
/*
* Dynamic IO functions - let the compiler
* optimize the expressions
*/
extern __inline__ void __outb (unsigned int value, unsigned int port)
{
unsigned long temp;
__asm__ __volatile__(
"tst %2, #0x80000000\n\t"
"mov %0, %4\n\t"
"addeq %0, %0, %3\n\t"
"strb %1, [%0, %2, lsl #2]"
: "=&r" (temp)
: "r" (value), "r" (port), "Ir" (PCIO_BASE - IO_BASE), "Ir" (IO_BASE)
: "cc");
}
 
extern __inline__ void __outw (unsigned int value, unsigned int port)
{
unsigned long temp;
__asm__ __volatile__(
"tst %2, #0x80000000\n\t"
"mov %0, %4\n\t"
"addeq %0, %0, %3\n\t"
"str %1, [%0, %2, lsl #2]"
: "=&r" (temp)
: "r" (value|value<<16), "r" (port), "Ir" (PCIO_BASE - IO_BASE), "Ir" (IO_BASE)
: "cc");
}
 
extern __inline__ void __outl (unsigned int value, unsigned int port)
{
unsigned long temp;
__asm__ __volatile__(
"tst %2, #0x80000000\n\t"
"mov %0, %4\n\t"
"addeq %0, %0, %3\n\t"
"str %1, [%0, %2, lsl #2]"
: "=&r" (temp)
: "r" (value), "r" (port), "Ir" (PCIO_BASE - IO_BASE), "Ir" (IO_BASE)
: "cc");
}
 
#define DECLARE_DYN_IN(sz,fnsuffix,instr) \
extern __inline__ unsigned sz __in##fnsuffix (unsigned int port) \
{ \
unsigned long temp, value; \
__asm__ __volatile__( \
"tst %2, #0x80000000\n\t" \
"mov %0, %4\n\t" \
"addeq %0, %0, %3\n\t" \
"ldr" ##instr## " %1, [%0, %2, lsl #2]" \
: "=&r" (temp), "=r" (value) \
: "r" (port), "Ir" (PCIO_BASE - IO_BASE), "Ir" (IO_BASE) \
: "cc"); \
return (unsigned sz)value; \
}
 
extern __inline__ unsigned int __ioaddr (unsigned int port) \
{ \
if (__PORT_PCIO(port)) \
return (unsigned int)(PCIO_BASE + (port << 2)); \
else \
return (unsigned int)(IO_BASE + (port << 2)); \
}
 
DECLARE_DYN_IN(char,b,"b")
DECLARE_DYN_IN(short,w,"")
DECLARE_DYN_IN(long,l,"")
 
#undef DECLARE_DYN_IN
 
/*
* Constant address IO functions
*
* These have to be macros for the 'J' constraint to work -
* +/-4096 immediate operand.
*/
#define __outbc(value,port) \
({ \
if (__PORT_PCIO((port))) \
__asm__ __volatile__( \
"strb %0, [%1, %2]" \
: : "r" (value), "r" (PCIO_BASE), "Jr" ((port) << 2)); \
else \
__asm__ __volatile__( \
"strb %0, [%1, %2]" \
: : "r" (value), "r" (IO_BASE), "r" ((port) << 2)); \
})
 
#define __inbc(port) \
({ \
unsigned char result; \
if (__PORT_PCIO((port))) \
__asm__ __volatile__( \
"ldrb %0, [%1, %2]" \
: "=r" (result) : "r" (PCIO_BASE), "Jr" ((port) << 2)); \
else \
__asm__ __volatile__( \
"ldrb %0, [%1, %2]" \
: "=r" (result) : "r" (IO_BASE), "r" ((port) << 2)); \
result; \
})
 
#define __outwc(value,port) \
({ \
unsigned long v = value; \
if (__PORT_PCIO((port))) \
__asm__ __volatile__( \
"str %0, [%1, %2]" \
: : "r" (v|v<<16), "r" (PCIO_BASE), "Jr" ((port) << 2)); \
else \
__asm__ __volatile__( \
"str %0, [%1, %2]" \
: : "r" (v|v<<16), "r" (IO_BASE), "r" ((port) << 2)); \
})
 
#define __inwc(port) \
({ \
unsigned short result; \
if (__PORT_PCIO((port))) \
__asm__ __volatile__( \
"ldr %0, [%1, %2]" \
: "=r" (result) : "r" (PCIO_BASE), "Jr" ((port) << 2)); \
else \
__asm__ __volatile__( \
"ldr %0, [%1, %2]" \
: "=r" (result) : "r" (IO_BASE), "r" ((port) << 2)); \
result & 0xffff; \
})
 
#define __outlc(v,p) __outwc((v),(p))
 
#define __inlc(port) \
({ \
unsigned long result; \
if (__PORT_PCIO((port))) \
__asm__ __volatile__( \
"ldr %0, [%1, %2]" \
: "=r" (result) : "r" (PCIO_BASE), "Jr" ((port) << 2)); \
else \
__asm__ __volatile__( \
"ldr %0, [%1, %2]" \
: "=r" (result) : "r" (IO_BASE), "r" ((port) << 2)); \
result; \
})
 
#define __ioaddrc(port) \
({ \
unsigned long addr; \
if (__PORT_PCIO((port))) \
addr = PCIO_BASE + ((port) << 2); \
else \
addr = IO_BASE + ((port) << 2); \
addr; \
})
 
/*
* Translated address IO functions
*
* IO address has already been translated to a virtual address
*/
#define outb_t(v,p) \
(*(volatile unsigned char *)(p) = (v))
 
#define inb_t(p) \
(*(volatile unsigned char *)(p))
 
#define outl_t(v,p) \
(*(volatile unsigned long *)(p) = (v))
 
#define inl_t(p) \
(*(volatile unsigned long *)(p))
 
#endif
/shmparam.h
0,0 → 1,5
/*
* linux/include/asm-arm/arch-a5k/shmparam.h
*
* Copyright (c) 1996 Russell King.
*/

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.