1. Field of the Invention
The present invention relates to an apparatus and method for performing magnitude detection for arithmetic operations.
2. Description of the Prior Art
In many data processing applications there is a requirement to perform arithmetic operations and to perform scaling of the arithmetic result. One technique for performing scaling is a block floating point technique. In block floating-point arithmetic a block of data elements is assigned a single exponent rather than each data element having its own exponent. Accordingly, the exponent is typically determined by the data element in the block having the largest magnitude. The block floating point technique reduces the number of bits required to maintain precision in a series of calculations relative to standard floating-point arithmetic. Block floating point calculations are typically performed in software and require scaling of the complete data set following each stage of calculations that may involve a change in magnitude of the data values. The extra instructions required to maintain the data scaling to prevent overflow diminish processing performance in terms of both processing cycles and power consumption.
Accordingly, there is a requirement to improve the efficiency of calculations, such as block floating point calculations, which require both data scaling and arithmetic operations to be performed on data.
According to a first aspect, the present invention provides an apparatus for processing data, said apparatus comprising:
processing circuitry for performing data processing operations;
one or more registers for storing data;
control circuitry for controlling said processing circuitry to perform said data processing operations;
wherein said control circuitry is configured such that it is responsive to a combined magnitude-detecting arithmetic instruction to control said processing circuitry to perform an arithmetic operation on at least one data element stored in said one or more of registers and specified by said combined magnitude-detecting arithmetic instruction and to perform a magnitude-detecting operation, wherein said magnitude-detecting operation calculates a magnitude-indicating result providing an indication of a position of a most-significant bit of a magnitude of a result of said arithmetic operation irrespective of whether said most-significant bit position exceeds a data element width of said at least one data element.
The present invention recognises that by providing a single instruction that both performs an arithmetic operation on at least one data element and performs a magnitude-detecting operation to provide an indication of a most-significant bit position of the arithmetic operation irrespective of whether the most-significant bit-position exceeds a data element width of the data element, the program code density for algorithms that perform both arithmetic manipulations and data scaling can be reduced. Providing a special-purpose instruction that both calculates an arithmetic result and facilitates calculation of the position of the most-significant bit of the arithmetic result means that common data manipulations can be performed more efficiently than in known systems which provide separate magnitude-detecting and arithmetic operations. The improved efficiency is achieved a result of fewer instructions being executed, higher throughput and reduced power consumption for the same functionality relative to previously known systems.
The combined magnitude-detecting arithmetic instruction according to the present technique can be implemented in a data processing apparatus comprising only scalar processing circuitry. In one embodiment, the processing circuitry is SIMD processing circuitry arranged to independently perform the arithmetic operation for each of a plurality of SIMD lanes, the combined magnitude-detecting arithmetic instruction identifying at least one SIMD input vector comprising a plurality of data elements on which the arithmetic operation is independently performed to generate a SIMD result vector comprising a respective plurality of result data-elements. This offers improved efficiency since it enables a plurality of magnitude-indicating results corresponding to a respective plurality of result data-elements of a SIMD result vector to be calculated substantially simultaneously.
Although the magnitude-indicating result could indicate the most significant bit for any one of the plurality of data elements within a SIMD result vector, in one embodiment, the magnitude-indicating result provides an indication of a most-significant bit of a greatest of a plurality of magnitudes corresponding to a respective plurality of data elements of the SIMD result vector. This efficiently provides information that allows for scaling of a data set.
The magnitude-indicating result can be provided in a variety of different forms, but in one embodiment, the magnitude-indicating result comprises a SIMD result vector having a plurality of magnitude-indicating result values corresponding respectively to the plurality of SIMD lanes.
The one or more registers of the data processing apparatus which is responsive to the combined magnitude-detecting arithmetic instruction could comprise a single register bank. However, in one embodiment, the one or more registers comprises a SIMD register bank and a scalar register bank. This allows for efficient implementation of the instruction in a SIMD system since the magnitude-indicating result can be stored in the scalar registers.
In one embodiment, the control circuitry controls the processing circuitry to store the result of the SIMD arithmetic operation in the SIMD register bank.
It will be appreciated that the magnitude-indicating result could be stored in any form of memory or in a special-purpose register. However, in one embodiment, the control circuitry controls the processing circuitry to store the magnitude-indicating result in a general purpose register. In one embodiment, the general purpose register is a SIMD register and in another embodiment the general purpose register is a scalar register. In yet a further alternative embodiment, the magnitude-indicating result is stored in a dedicated register.
The arithmetic operation could be any variant of arithmetic operation but in one embodiment, the arithmetic operation is an unsigned arithmetic operation and in another embodiment the arithmetic operation is a signed arithmetic operation.
It will be appreciated that the scaling calculation can be performed whilst the arithmetic operation is being performed. However, in one embodiment, the control circuitry is responsive to the combined magnitude-detecting arithmetic instruction to perform a scaling calculation to scale the at least one data element prior to performing the arithmetic operation in dependence upon a scaling parameter specified by the combined magnitude-detecting arithmetic instruction. This differs from known floating point arithmetic where the scaling operation is typically performed after the arithmetic operation has been performed.
It will be appreciated that the magnitude-indicating result could be calculated based on the unscaled result of the arithmetic operation and then some other scheme could be used to correct the result according to the known effect that the scaling would have. In one embodiment, the control circuitry is responsive to the combined magnitude-detecting arithmetic instruction to calculate the magnitude-indicating result from output of the scaling calculation.
Although the combined magnitude-detecting arithmetic instruction could be any type of instruction, in one embodiment, the combined magnitude-detecting arithmetic instruction is a block floating-point instruction. Providing the combined instruction alleviates a key performance problem (both processing cycles and power) with known block floating point techniques, which require additional instructions to maintain the data scaling.
It will be appreciated that the arithmetic operation could be any one of a number of different arithmetic operations, but in certain embodiments, the arithmetic operation is at least one of a move add, subtract, multiply and multiply-accumulate operation.
It will be appreciated that calculation of the magnitude-indicating result can be performed in any one of a number of ways. In one embodiment, the control circuitry is responsive to the combined magnitude-detecting arithmetic instruction to control the processing circuitry to perform at least one logical operation on at least two of the plurality of data elements of the result of the SIMD arithmetic operation to calculate the magnitude-indicating result, wherein the at least one logical operation is functionally equivalent to a logical OR operation. Calculation of the magnitude-indicating result using at least one logical operation which is functionally equivalent to a logical OR operation is straightforward and inexpensive to implement and involves only a small increase in the complexity of the ALU to achieve the improved efficiency.
Although the at least one logical operation could be performed on complete data elements of the arithmetic result or result vector, in one embodiment, the control circuitry is responsive to the combined magnitude-detecting arithmetic instruction to control the processing circuitry to perform the at least one logical operation on a subset of bits of the at least two data elements. This enables the most-significant bit position to be determined more efficiently by processing a smaller volume of data. In one such embodiment, the subset of bits corresponds to one or more most-significant bits of respective ones of the at least two data elements.
In one embodiment, the control circuitry is responsive to the combined magnitude-detecting arithmetic instruction to control the processing circuitry to detect one or more of the plurality of data elements of the result of the SIMD arithmetic operation having a negative value and to invert the negative value prior to performing the at least one logical operation.
In another embodiment, instead of inverting the negative value, the control circuitry is responsive to the combined magnitude-detecting arithmetic instruction to control the processing circuitry to detect one or more of the plurality of data elements of the result of the SIMD arithmetic operation having a negative value and to negate the negative values prior to performing the at least one logical operation. This enables accurate results for the most-significant bit position to be determined for scaling purposes even for signed data values. Negation and inversion of data values in this way is straightforward to implement.
In one embodiment, the control circuitry is responsive to the combined magnitude-detecting arithmetic instruction to control the processing circuitry to calculate the magnitude-indicating result in dependence upon an operand specified by the combined magnitude-detecting arithmetic instruction. In one such embodiment, the at least one logical operation is dependent upon the operand. This provides additional flexibility in performing the magnitude-detecting operation since, for example the operand can specify a common source and destination within the one or more registers for the at least one logical operation. This also provides a more efficient way of combining the most significant bit position calculations for a large loop by allowing the problem to be broken down into subsets of magnitude calculations for respective groups of result data values.
It will be appreciated that the magnitude-indicating result could be post-processed in any one of a number of different ways to derive the position of the most-significant non-zero bit. However, in one embodiment, the processing circuitry calculates the magnitude-indicating result such that the most-significant non-zero bit is derivable from the magnitude-indicating result by executing one of a Count Leading Zeros instruction and a Count Leading Sign instruction. The use of these pre-existing instructions makes the present technique easy to implement.
It will be appreciated that the magnitude-indicating result could be stored in any one of a number of different ways. However, in one embodiment, the control circuitry controls the processing circuitry to store the magnitude-indicating result in a magnitude-indicating register of the one or more registers.
In one such embodiment, the magnitude-indicating register is specified by a parameter of the combined magnitude-detecting arithmetic instruction. this is convenient to implement and allows for flexibility in specifying an appropriate register.
In one embodiment, the magnitude-indicating register is a general-purpose register. In some such embodiments the general purpose register is one of a SIMD register and a scalar register.
Although the combined magnitude-detecting arithmetic instruction could be included anywhere in program code where an indication of the magnitude of an arithmetic result is required, in one embodiment, the combined magnitude-detecting arithmetic instruction is provided within a loop of instructions such that the magnitude-indicating result is calculated for each iteration of the loop. The efficiency of providing a single instruction to perform an arithmetic instruction and in addition provide an indication of a most-significant bit-position of an arithmetic result is apparent particularly where such operations are likely to be repetitively performed in loops of program code.
In one embodiment, the control circuitry is responsive to the combined magnitude-detecting arithmetic instruction to accumulate the magnitude-indicating result for each iteration of the loop in the magnitude-indicating register. This provides the flexibility to break down a calculation of a most-significant bit-position for a plurality of result values into more manageable sub-calculations.
According to a second aspect, the present invention provides a method for processing data with a data processing apparatus having processing circuitry for performing data processing operations, a one or more registers for storing data and control circuitry for controlling said processing circuitry to perform said data processing operations, said method comprising in response to a combined magnitude-detecting arithmetic instruction:
controlling said processing circuitry to perform an arithmetic operation on at least one data element stored in said one or more registers and specified by said combined magnitude-detecting arithmetic instruction; and
performing a magnitude-detecting operation, wherein said magnitude-detecting operation calculates a magnitude-indicating result providing an indication of a position of a most-significant bit of a magnitude of a result of said arithmetic operation irrespective of whether said most-significant bit position exceeds a data element width of said at least one data element.
According to a third aspect the present invention provides a virtual machine providing an emulation of an apparatus for processing data, said apparatus comprising:
processing circuitry for performing data processing operations;
one or more registers for storing data;
control circuitry for controlling said processing circuitry to perform said data processing operations;
wherein said control circuitry is configured such that it is responsive to a combined magnitude-detecting arithmetic instruction to control said processing circuitry to perform an arithmetic operation on at least one data element stored in said one or more registers and specified by said combined magnitude-detecting arithmetic instruction and to perform a magnitude-detecting operation, wherein said magnitude-detecting operation calculates a magnitude-indicating result providing an indication of a position of a most-significant bit of a magnitude of a result of said arithmetic operation irrespective of whether said most-significant bit position exceeds a data element width of said at least one data element.
The above, and other objects, features and advantages of this invention will be apparent from the following detailed description of illustrative embodiments which is to be read in connection with the accompanying drawings.
The Fourier Transform is a mathematical operation that that decomposes a function into a continuous spectrum of its frequency components.
A discrete Fourier transform is a Fourier transform corresponding to discrete time signals and is widely employed in signal processing applications to analyse frequencies contained in a sample signal, to solve partial differential equations and to perform other operations such as convolutions. The Fast Fourier Transform (FFT) algorithm is used to compute a discrete Fourier transform.
The discrete Fourier Transform can be described by the following equation:
The transform computation involves calculating the sequence X(k) of complex numbers given N input data values corresponding to the sequence x(n) (usually also assumed to be complex valued) and where WN=e−j2π/N (twiddle factors).
Splitting X(k) into even-numbered and odd-numbered samples (process called decimation) gives
even samples
odd samples
These equations form the decimation-in frequency FFT algorithm for calculating the discrete Fourier transform. Computation of this N-point DFT via the decimation-in-frequency FFT requires N log2 N complex additions and (N/2) log2 N complex multiplications.
To directly evaluate the sums involved in the discrete Fourier transform equations would take the order to N2 mathematical operations for a total of N data samples, but the FFT algorithm allows the same result to be computed in only the order of N Log N operations. This simplification is achieved by recursively breaking down a discrete Fourier transform of any composite size N=N1.N2 into a plurality of smaller DFTs of sizes N1 and N2 and the order of N multiplications by complex roots of unity known as “twiddle factors”. The radix-2 FFT algorithm divides the discrete Fourier transform into two pieces of size N/2 at each step.
The basic computation represented by the butterfly diagram of
The FFT computation involves a plurality of loops of calculation each loop of which involves calculation of a plurality of butterfly diagrams. Thus the output values A and B in
It can be seen from the data flow of the
Thus the addition and multiplication operations cause the data bit width to grow proportionally to the number of iterations of the algorithm in which the butterfly operations are calculated. In general the number of iterations depends on the logarithm (base 2) of the number of input data points. Thus it will be appreciated that an FFT computation typically increases the dynamic range in proportion to the number of elements being processed. Similar considerations apply to other different signal processing algorithms such as the Viterbi algorithm and Turbo decoding algorithms and the present technique is applicable to a range of different algorithms, the FFT algorithm being only one illustrative example.
To cope with the large dynamic range of such computations, a block floating-point arithmetic computation can be performed. In block floating-point arithmetic a block of data is assigned a single exponent rather than each data element having its own exponent. Accordingly, the exponent is typically determined by the data element in the block having the largest magnitude. The use of block floating-point arithmetic obviates the need for complex floating-point multipliers and floating-point adders. Instead, a complex value integer pair is represented with a single scale factor that is typically shared amongst other complex value integer pairs of the block of data. After each stage of the FFT, the largest magnitude output value is detected and the result of the given iteration is scaled to improve the precision of the calculation. The exponent records the number of left or right shifts used to perform the scaling. The conversion from fixed-point to block floating-point representation is typically performed explicitly by the programmer in software.
The process begins at stage 210 where a block of input data is searched for the value “dmax” corresponding to an input data element having the largest magnitude. Next, at stage 220 a scaling shift value is determined in dependence upon the value of dmax. The process then proceeds to stage 230 the value of j, which is an index for an FFT outer loop, is initialised for j=1 to a value of unity and subsequently incremented on successive loops.
Next, at stage 240, an FFT inner loop index, i, is initialised on the first iteration and subsequently incremented. This inner loop corresponds to performing one complete round of butterfly computations on all of the input data elements. The first stage of the inner loop calculation is stage 250, which involves scaling all of the input data elements by the predetermined scaling shift value. Note that the scaling shift value is determined at stage 220 for the first iteration, but is subsequently determined at stage 290, i.e., at the end of each FFT inner loop. Following the scaling of the input data at stage 250, each data element shares the same exponent value and the same data-element width. Stage 260 corresponds to the body of the FFT inner loop calculation which involves computation of a plurality of butterfly diagrams such as the one illustrated in
Once the value of dmax has been updated at stage 270, the process proceeds to stage 280, where it is determined whether or not the FFT inner loop is complete. If the inner loop is not complete then the process returns to stage 240 where the index i is incremented and the next iteration of the FFT inner loop is performed. If, on the other hand, it is determined at stage 280 that the inner loop is in fact complete then the process proceeds to stage 290 where the current value of dmax′ is used to calculate a new scaling shift value for use in a subsequent FFT outer loop. This scaling shift value is applied at stage 250 to all of the input data prior to performing the next round of FFT inner loop calculations.
After the scaling shift value has been calculated at stage 290, the process proceeds to stage 292, where it is determined whether or not the FFT outer loop is complete. If the outer loop is not complete then the process returns to stage 230 where the counter j is incremented and a data rearrangement is performed prior to the next round of butterfly calculations in the FFT inner loop. If, on the other hand, it is determined at stage 292 that the outer loop is in fact complete then the process proceeds to stage 294 where a data normalisation is performed to take account of the effects of the scaling of the data performed at each stage of the calculation. However, the normalisation stage 294 is optional. Finally, at stage 296, the results of the FFT calculation are saved in memory.
Comparison of the flow chart of
The combining of steps (i) and (ii) above is made possible by providing a single program instruction that both performs the required arithmetic operation(s) and provides magnitude information associated with the result of the arithmetic operation(s). In the case of the FFT calculations, the arithmetic operations are as shown in
Calculation of the scaling shift value from dmax′ at stage 390 of the flow chart of
For example:
MSB_Position=CLS(dmax′);
If, for example the container is 16-bit, and dmax′ is 0001—0000—0000—0000 (in binary), corresponding to +4096 in decimal, CLS will return a value of 3. Considering signed integers, if for example dmax′ is 1111—1000—0000—0000 (in binary), corresponding to −2048 decimal then, CLS will return a value of 5. The scaling shift value is calculated as follows:
Shift_Value=Target—MSB−MSB_Position;
where the target MSB position is where the MSB of the largest scaled datum should lie. The target MSB is chosen such that no overflow can occur. If the Shift is positive then the data is shifted left whereas if the shift is negative the data is shifted to the right.
The result of the calculation at stage 390 is applied at stage 350. Alternative embodiments use the result of the arithmetic operation (stage 360 in this particular example) and then use a different scheme to correct the result according to the known effect that the scaling will have on the result. Note that in alternative arrangements stage 350 and 360 can be swapped so that scaling is perfromed after the FFT inner loop calculation. If the calculation result is a negative value then the most significant bit is determined from an inverted form of the result such that the combined MSB result becomes OR_MSB=Current_OR_MSB|(Result<0 ?˜Result: Result).
As explained above, the embodiment of
The step 450 is adapted such that it takes into account possible overflows that may occur in the calculation prior to the scaling of the input data. Fusing operations 250, 260 and 270 of the known block floating point algorithm of
In the embodiment of
One example of a combined magnitude-detecting arithmetic instruction according to the present technique is the “Vres” instruction (see al FIG. 5):—
vRes=vadd
—
bf
—
s16(vA, vB, sMask).
This vRes instruction takes two SIMD vector input operands Va and Vb, each packed vector comprising thirty-two 16-bit data elements. A further input parameter “sMask” specifies a 16-bit scalar value corresponding to a scalar register within the scalar register bank 540. In this particular example, the arithmetic operation is an add operation “vadd”. Thus thirty-two independent additions are performed corresponding to the thirty-two data elements of the packed vectors vA and vB.
Now consider how the vRes instruction is implemented by the data engine of
The controller 510 is responsive to an instruction corresponding to the vadd “primitive” (or “intrinsic”) shown in
Scaled results output by the SIMD shifter 524 are supplied as input to the maximum mask circuitry 526 within the SIMD ALU 520 where an updated value of the MSB mask is calculated in dependence upon the scaled results. The maximum mask calculation is explained in detail below with reference to
An updated value for the MSB mask for a current FFT inner loop is supplied via path 527 to the scalar register bank 540 for storage in a scalar register for use in the next iteration of the FFT inner loop. The input parameter sMask of the vRes instruction specifies a scalar register from which the maximum mask circuitry 526 reads a current value of the MSB mask at the beginning of an FFT inner loop iteration and the updated value of the MSB mask is written to the sMask register at the end of the iteration.
In an alternative embodiment to that of
<arithmetic op>_bf SIMD destination, SIMD operand—1, SIMD operand—2, scalar mag, scalar shift
where _bf qualifies the instruction as being of block floating point type; <arithmetic op> can be add, subtract etc; SIMD indicates that operand—1, operand—2 and destination are SIMD registers. The values “mag” and “shift” are both scalar values. The value “mag” specifies a common source and destination register for an ORing operation used to determine the most-significant-bit. The value “shift” is a signed value that specifies the shift to be applied to the result of the arithmetic operation. Note that in alternative embodiments the scalar shift field is omitted from the instruction and instead of combing the data scaling with the instruction, the data scaling is performed as data is written to or read from memory. The shift performed to implement the scaling of step 250 of
The arithmetic unit 522 of the SIMD ALU 520 comprises circuitry adapted to allow for extra carries generated prior to the scaling operation by the arithmetic operation of the vRes instruction.
The maximum mask circuitry 526 of the SIMD ALU 520 is operable to combine the most significant bit position returned by each of the plurality of program instructions of the inner loop of the FFT calculation. Thus a plurality of most significant bit values are combined and the scalar register sMask of the scalar register bank 540 maintains the value corresponding to the highest most significant bit position. Thus at the end of each inner FFT loop iteration the most significant bit overall for the given iteration is read from the scalar register and used for scaling data in the subsequent iteration.
In the embodiment of
Each 16-bit data element 610, 612, 614 is a signed data value in which bit 15 is the sign-bit. The data values are stored in “2's complement” notation in which negative numbers are represented by the 2's complement of the absolute value and a number is converted from positive to negative or vice versa by computing its 2's complement. To find the 2's complement of a binary number each bit is inverted and the value of 1 is added to the inverted value (bit overflow is ignored). The 2's complement of a negative number is the corresponding positive value. For example consider an 8-bit signed binary representation of the decimal value 5 which is 0000101. Since the most significant bit is a 0 this pattern represents a non-negative value. To convert this positive value to −5 in 2's complement notation each bit is inverted to give the value 1111010 and then a 1 is added to the inverted value to give 11111011. The most significant bit is a 1 so the value represented is negative (−5 in this case).
In the arrangement of
As shown in
The OR gate 632 represents a logical OR of all of the 32-bits corresponding to bit-position 14 of the thirty-two data elements corresponding to the thirty-two SIMD lanes. Although an equivalent functional OR gate could be provided for each of the 15 non-signed bits of the data element, in this particular embodiment, the OR gates 630 are provided for only the four most significant bit positions i.e. bits [11, 12, 13, 14].
Only a subset of the most significant bits need be considered to accurately determine the most significant bit due to the fact that the programmer is able to determine ahead of time how many carry bits a given round of calculations is likely to generate. For example, in the butterfly diagram of
In this particular arrangement the most significant bit determination is performed on the SIMD result vector after the scaling shift has been performed (scaling at stage 350 of the flow chart of
The arrangement of
In the arrangement of
The mask register 740 is a “modal” register that accumulates the most significant bit position information. The mask register is initialised e.g. to zero before a block of calculations begins. For the first iteration of a loop of calculations, the mask calculation circuitry 760 calculates the mask (i.e. the MSB position) for each executed instruction and stores the current value in the mask register 740. For subsequent iterations, the MSB position determined for a given iteration is combined with the current MSB position stored in the mask register 740 such that the register maintains the highest MSB position. The mask register 740 is then read at the end of a block of calculations to determine the highest-valued MSB that has been reached.
The following is an excerpt of program code than makes use of the combined magnitude-detecting arithmetic instruction according to the present technique. The program code is for a block floating-point radix 2 FFT algorithm.
The butterfly diagrams of
rr0=vpqadd—m—bf—s16(r0,r1,jj,&sMaskR1);
ii0=vpqadd—m—bf—s16(i0,i1,jj,&sMaskI1);
The “vpqadd” instructions involve an addition operation and a magnitude-detecting operation whereas the “vpqsub” instructions involve a subtraction operation and a magnitude-detecting operation. The instruction input argument “sMaskR1” is the MSB mask for the real component of the result vector whereas “sMaskI1” is the MSB mask for the imaginary component of the result vector. The masks are combined at the end of the above section of program code (outside the FFT inner loop but within the FFT outer loop). The CLZ instruction is used to determine the position of the most significant bit at the end of each FFT inner loop.
Whilst the above described techniques may be performed by hardware executing a sequence of native instructions which include the above-mentioned instructions, it will be appreciated that in alternative embodiments, such instructions may be executed in a virtual machine environment, where the instructions are native to the virtual machine, but the virtual machine is implemented by software executing on hardware having a different native instruction set. The virtual machine environment may provide a full virtual machine environment emulating execution of a full instruction set or may be partial, e.g. only some instructions, including the instructions of the present technique, are trapped by the hardware and emulated by the partial virtual machine.
More specifically, the above-described combined magnitude-detecting arithmetic instructions may be executed as native instructions to the full or partial virtual machine, with the virtual machine together with its underlying hardware platform operating in combination to provide the processing circuitry described above.
Although a particular embodiment has been described herein, it will be appreciated that the invention is not limited thereto and that many modifications and additions thereto may be made within the scope of this invention. For example, various combinations of the features of the following dependent claims could be made with the features of the independent claims without departing from the scope of the present invention.
Although illustrative embodiments of the invention have been described in detail herein with reference to the accompanying drawings, it is to be understood that the invention is not limited to those precise embodiments, and that various changes and modifications can be effected therein by one skilled in the art without departing from the scope and spirit of the invention as defined by the appended claims.
Number | Date | Country | Kind |
---|---|---|---|
0721323.4 | Oct 2007 | GB | national |